Rails包含模型故障中的模块

时间:2012-07-10 20:16:48

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我在 /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

2 个答案:

答案 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范围?无论如何,正如你所看到的,我还不熟悉那些。如果你感兴趣的话,你可能想要挖掘这个主题