Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 关系随机引发ActiveRecord::RecordNotFound_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 关系随机引发ActiveRecord::RecordNotFound

Ruby on rails 关系随机引发ActiveRecord::RecordNotFound,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,偶尔在尝试获取特定用户的订单记录时,会引发ActiveRecord::RecordNotFound 这里需要注意的一些事情 访问/orders/:id时会引发错误,但并非所有用户都会出现此错误。我们跟踪已完成的订单,这意味着您最终会进入订单页面,大约50%的用户会获得404。请注意,我们谈论的是50%的用户,而不是请求。如果它为特定用户的订单显示404一次,它将始终显示404。 该记录的存在是因为它可以使用控制器中记录的相同数据通过控制台访问。 重新部署应用程序时,问题消失。 有什么问题吗 我正

偶尔在尝试获取特定用户的订单记录时,会引发ActiveRecord::RecordNotFound

这里需要注意的一些事情

访问/orders/:id时会引发错误,但并非所有用户都会出现此错误。我们跟踪已完成的订单,这意味着您最终会进入订单页面,大约50%的用户会获得404。请注意,我们谈论的是50%的用户,而不是请求。如果它为特定用户的订单显示404一次,它将始终显示404。 该记录的存在是因为它可以使用控制器中记录的相同数据通过控制台访问。 重新部署应用程序时,问题消失。 有什么问题吗

我正在运行rails 4.2.0

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])