我在 /lib/models/scopes.rb
中有模块module Models
module Scopes
extend ActiveSupport::Concern
...
end
end
我正试图从模型中包含它:
class User < ActiveRecord::Base
include Models::Scopes
end
收到错误:
NameError:未初始化的常量User :: Models
如何解决这个问题?将这类文件保存在/ lib中可能是错的吗?
环境: Rails v3.1 Ruby v1.9.3
答案 0 :(得分:8)
Rails不需要自动lib
目录中的文件,但您可以添加到config/application.rb
中的自动加载路径:
config.autoload_paths += %W(#{config.root}/lib)
重新启动服务器以获取新设置。
现在,当模块名称 first 使用时,这将自动加载文件。在开发模式下,您可能希望在每次更改后重新加载模块,以便在不重新启动服务器的情况下查看更改。为此,请将其添加为急切的加载路径:
config.eager_load_paths += %W(#{config.root}/lib)
只要您在 Models
或其他任何地方没有User
类或模块,范围就不会有问题。
答案 1 :(得分:2)
当您定义类时,您将“打开”新范围。因此,当您执行Models::Scopes
时,ruby正在寻找User::Models::Scopes
。您可以使用::Models::Scopes
来解决此问题,::
告诉ruby查看全局范围。
仅供参考:我不确定我使用的术语,或者即使我的思路正确也是如此;但无论如何,解决方案应该是好的。我认为Ruby会在找不到::Models::Scope
之后尝试User::Models::Scope
,但它没有...也许在某处定义了User::Models
范围?无论如何,正如你所看到的,我还不熟悉那些。如果你感兴趣的话,你可能想要挖掘这个主题