【问题标题】:Ruby on Rails returns 404 on existing resourceRuby on Rails 在现有资源上返回 404
【发布时间】:2021-08-25 12:22:57
【问题描述】:

我有一个连接到 Postgres 数据库的 Rails 后端。我有一个方法是资源的索引。基本上:

/users/{id}

我的代码如下:

  def show
    render json: @user, serializer_options: { actions: true, statistics: true }
  end

@user 是使用 CanCan 的 load_and_authorize_resource 设置的。像这样:

load_and_authorize_resource :user, through: :company, shallow: true

这是使用 URL 中提供的 ID 作为参数设置的。

我正在使用序列化程序。问题是 show route 在单个 ID 上返回 404。据我所知,它在所有其他 ID 上都能正常工作。此外,该记录存在于数据库中。

我确定用户存在,因为当我运行时:

User.find({id})

在控制台上它会正确返回用户。

因此,出于某种原因,Rails 无法找到该记录。有什么办法可以调试这个问题吗?

【问题讨论】:

  • 你确认@user 设置了吗?您可以在@user 分配之前添加debugger 并在服务器控制台中验证用户查找器代码。
  • 你如何设置@user?你怎么确定这个用户存在?正在执行什么查询?您没有为我们提供很多帮助,因此很难提供帮助。
  • @engineersmnky,@user 正在使用 CanCan 的 load_and_authorize_resource 进行设置。像这样:load_and_authorize_resource :user, through: :company, shallow: true,这是使用 URL 中提供的 ID 作为参数设置的。我确定用户存在,因为当我在控制台上运行 User.find({id}) 时,它会正确返回用户。
  • 您应该将它添加到帖子本身,这样它就不会在 cmets 中丢失。同时发布正在执行的查询。这些可以在日志输出中找到。
  • 由于您在 CanCan 调用中使用了through: :company 选项,因此用户实际上正在加载类似@company.users.find(params[:id]) 的内容。我会仔细检查用户是否属于您期望的公司。如果一切正常,请将日志设置为 DEBUG 级别并观察在您尝试加载页面时执行的查询——它应该显示失败的查询。请注意,404 是 Rails 中对任何 ActiveRecord::RecordNotFound 异常的自动响应。

标签: ruby-on-rails database serialization activerecord cancancan


【解决方案1】:

我想通了。这是我如何得出答案的。我在控制台上运行了以下内容:

user = User.find({id})
ApplicationController.render json: user, serializer: UserSerializer

这向我展示了创建 ActiveRecord::RecordNotFound 的确切值。原来我的应用程序中有一个位置允许保存无效的 id。所以数据库没有找到记录。它与用户无关,但它发生在序列化程序中。

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 2011-05-25
    • 2011-04-13
    • 2011-05-20
    • 2023-03-29
    相关资源
    最近更新 更多