Ruby on rails 关系随机引发ActiveRecord::RecordNotFound
偶尔在尝试获取特定用户的订单记录时,会引发ActiveRecord::RecordNotFound 这里需要注意的一些事情 访问/orders/:id时会引发错误,但并非所有用户都会出现此错误。我们跟踪已完成的订单,这意味着您最终会进入订单页面,大约50%的用户会获得404。请注意,我们谈论的是50%的用户,而不是请求。如果它为特定用户的订单显示404一次,它将始终显示404。 该记录的存在是因为它可以使用控制器中记录的相同数据通过控制台访问。 重新部署应用程序时,问题消失。 有什么问题吗 我正在运行rails 4.2.0Ruby on rails 关系随机引发ActiveRecord::RecordNotFound,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,偶尔在尝试获取特定用户的订单记录时,会引发ActiveRecord::RecordNotFound 这里需要注意的一些事情 访问/orders/:id时会引发错误,但并非所有用户都会出现此错误。我们跟踪已完成的订单,这意味着您最终会进入订单页面,大约50%的用户会获得404。请注意,我们谈论的是50%的用户,而不是请求。如果它为特定用户的订单显示404一次,它将始终显示404。 该记录的存在是因为它可以使用控制器中记录的相同数据通过控制台访问。 重新部署应用程序时,问题消失。 有什么问题吗 我正
class OrdersController < ApplicationController
#
# GET /orders/:id
#
def show
Rails.logger.info "current_user=#{current_user.id}, params[:id]=#{params[:id]}"
@order = current_user.orders.find(params[:id])
end
end
class ApplicationController < ActionController::Base
def current_user
@_current_user ||= User.find_by_id(cookies.signed[:uid])
end
end
class User < ActiveRecord::Base
has_many :subscriptions
has_many :orders, through: :subscriptions
end
class Order < ActiveRecord::Base
has_one :user, through: :subscription
end
class Subscription < ActiveRecord::Base
belongs_to :user
end
我认为您必须首先检查用户的存在,然后才能跟踪bug
当我遇到一些问题时,我通常使用这种方法
def show
if user_signed_in?
begin
@order = current_user.orders.find(params[:id])
rescue => e
binding.pry
end
else
return redirect_to <404 page or any>, alert: 'Order not found'
end
end
但是您需要“rails pry”gem,其优点是rails会在出现异常时启动rails控制台。通过查看注释列表可以找到我们得出结论的方式 我们的调查结果总结如下: 订单被缓存,或者当前用户与缓存的关联一起过时 直接进入订单工作,即order.find/User.findcurrent\u User.id.orders。。。 我们达成的解决方案是:
current_user.reload!
演出前
current_user.orders.find(params[:id])
我非常感兴趣的是,您的日志记录程序中会写入哪些内容。我认为你获取用户的方式有问题。你能发布日志吗?我已经添加了一些日志,还有一个控制台示例。rails可能缓存了对当前用户的大量查询,请检查当前用户的情况是否如此。orderstrue.findparams[:id]谢谢。很高兴收到赞赏:这是在检查其他人,也会引发一个零异常,而不是订单对象上的404。
def show
if user_signed_in?
begin
@order = current_user.orders.find(params[:id])
rescue => e
binding.pry
end
else
return redirect_to <404 page or any>, alert: 'Order not found'
end
end
current_user.reload!
current_user.orders.find(params[:id])