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的主要内容,如果未能解决你的问题,请参考以下文章
Heroku上的现有Ruby on Rails Web应用程序(PostgreSQL),Devise身份验证,需要为移动支持添加Rails API
Ruby on Rails:如何使用迁移向现有列添加非空约束?