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
我遇到间歇性错误,其中 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