ActiveResource "NoMethodError (undefined method `path' for nil:NilClass):" 间歇性错误

ActiveResource "NoMethodError (undefined method `path' for nil:NilClass):" intermittent error

我遇到间歇性错误,其中 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 每当对源进行更改时自动重新加载资源 class 定义文件。它将重新加载 class 定义:

# app/models/resources/cart.rb

class Cart < ActiveResource::Base
  validates :session_id, presence: true
end

并且由于 Cart.site 定义未按预期包含在该文件中,资源被有效地重置,site 配置被 auto-reload 进程破坏。

解决方法是将Cart.site定义移动到资源定义中:

# app/models/resources/cart.rb

class Cart < ActiveResource::Base
  self.site = ENV["ROOT_URL"]

  validates :session_id, presence: true
end