【发布时间】: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