Ruby on Rails 在现有资源上返回 404

Posted

技术标签:

【中文标题】Ruby on Rails 在现有资源上返回 404【英文标题】:Ruby on Rails returns 404 on existing resource 【发布时间】: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 异常的自动响应。 【参考方案1】:

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

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

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

【讨论】:

以上是关于Ruby on Rails 在现有资源上返回 404的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails SOA 设计资源和示例

Heroku上的现有Ruby on Rails Web应用程序(PostgreSQL),Devise身份验证,需要为移动支持添加Rails API

Ruby on Rails:如何使用迁移向现有列添加非空约束?

如何从 ruby​​ on rails 上的现有远程 oracle 数据库中获取数据

ruby-on-rails - 嵌套资源问题

让 wkhtmltoimage 在 Amazon Linux / Ruby on Rails 上工作的问题