我遇到了一个间歇性错误,其中ActiveResource资源调用如下:
Cart.where(session_id: get_guid, status: 1)
引发错误:
NoMethodError (undefined method `path' for nil:NilClass)
但只是间歇性的。重新启动 Rails 服务器可以暂时解决问题,但不确定的时间后,它再次中断。
问题的根源是由于Rails的自动加载功能。一些认识使我找到了这个解决方案。
我们有很多 ActiveResource 资源,所以为了轻松初始化资源,我们将安装程序放在初始值设定项中(仅在 Rails 服务器启动期间运行):
# config/initializers/active_resource_setup.rb
Cart.site = ENV["ROOT_URL"]
我还意识到,这在生产环境中不是问题。这在以前并不清楚,因为这个问题出现在一次重大的 Rails 升级过程中,所以我认为我一开始就破坏了它。
但是,问题的根源是每当对源进行更改时,Rails 都会自动重新加载资源类定义文件。它将重新加载类定义:
# app/models/resources/cart.rb
class Cart < ActiveResource::Base
validates :session_id, presence: true
end
由于Cart.site
定义未按预期在此文件中,因此资源被有效地重置,并且site
配置被自动重新加载过程破坏。
解决方案是将Cart.site
定义移动到资源定义中:
# app/models/resources/cart.rb
class Cart < ActiveResource::Base
self.site = ENV["ROOT_URL"]
validates :session_id, presence: true
end