如何解决在非开发环境中重写 const_missing 返回 `NameError 未初始化常量`
我的 rails 应用中有以下代码
# app/models/test_module/text_class.rb
module TestModule
class TestClass
end
end
# app/models/test_module.rb
module TestModule
def self.const_missing(name)
super(delete_end_number(name.to_s).to_sym)
end
def self.delete_end_number(str)
str.gsub(/\d+$/,'')
end
end
当它在开发中运行时它可以工作
>> TestModule::TestClass1
=> TestModule::TestClass
当我在生产中运行它时,我得到
NameError (uninitialized constant TestModule::TestClass)
如果我只是将 TestModule::TestClass
复制到控制台,它就可以工作。它似乎不适用于 const_missing
方法。
我怀疑这可能与自动加载有关,因为当我在 development.rb 中将 config.cache_classes
和 config.eager_load
设置为 true 时,它也会发生在那里。我似乎无法弄清楚如何让它在缓存环境中工作。
解决方法
更改自
super(delete_end_number(name.to_s).to_sym)
到
const = delete_end_number(name.to_s).to_sym
ActiveSupport::Dependencies.load_missing_constant(self,const)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。