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

4

2 回答 2

8

Rails 不会lib自动要求目录中的文件,但您可以添加到自动加载的路径中config/application.rb

config.autoload_paths += %W(#{config.root}/lib)

重新启动服务器以获取新设置。

这将在第一次使用模块名称时自动加载文件。在开发模式下,您可能希望在每次更改后重新加载模块,以便在不重新启动服务器的情况下查看更改。为此,请将其添加为急切加载路径:

config.eager_load_paths += %W(#{config.root}/lib)

只要您在内部或其他任何地方没有Models类或模块,范围就不应该成为问题。 User

于 2012-07-10T20:41:40.200 回答
2

当你定义你的班级时,你正在“打开”一个新的范围。所以当你这样做时Models::Scopes,ruby 正在寻找User::Models::Scopes。你可以通过使用来解决这个问题::Models::Scopes::告诉 ruby​​ 在全局范围内查看。

仅供参考:我不确定我使用的术语,或者我的思路是否正确;但无论如何,解决方案应该是好的。我认为 Ruby::Models::Scope在 find 失败后会尝试User::Models::Scope,但它没有......也许在User::Models某处定义了一个范围?无论如何,如您所见,我还不熟悉这些。如果您感兴趣,您可能想深入研究这个主题

于 2012-07-10T20:24:27.577 回答