Ruby on rails 从Rails 3项目的lib目录中访问模型

Ruby on rails 从Rails 3项目的lib目录中访问模型,ruby-on-rails,Ruby On Rails,我在lib目录中有一个文件,它使用模型中定义的一些常量,如: class User < ActiveRecord::Base MAX_EMAIL_ADDRESS_LENGTH = 255 end 由于找不到类用户,因此失败。如何在lib上加载该文件之前加载用户 我正在加载该文件,方法是在我的application.rb中包含以下内容: config.autoload_paths += %W(#{config.root}/lib) 默认情况下,YourApplicationName

我在lib目录中有一个文件,它使用模型中定义的一些常量,如:

class User < ActiveRecord::Base
   MAX_EMAIL_ADDRESS_LENGTH = 255
end
由于找不到类用户,因此失败。如何在lib上加载该文件之前加载用户

我正在加载该文件,方法是在我的application.rb中包含以下内容:

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

默认情况下,
YourApplicationNameHere::Application.autoload_路径
[]
。我(纯粹出于组织原因)也为我的
app/models
目录添加了一个glob

config.autoload_paths += Dir["#{Rails.root}/app/models/**/"]
config.autoload_paths += Dir["#{config.root}/lib"]
有了这个设置,我可以毫不费力地完成你在问题中提出的问题。如果Rails在
lib/
模块的实例化中找不到
User
模型,那么这也会让您受益匪浅

编辑

在问题中指定准确的错误消息也会有所帮助

uninitialized constant Foo::User
表示Ruby/Rails正在
Foo
名称空间中查找
User
。在
用户
前面加上
,以强制查找全局命名空间

module Foo
  LONG_EMAIL_ADDRESS = "foo@bar.com".rjust(::User::MAX_EMAIL_ADDRESS_LENGTH, "a")
end

您的类用户似乎没有被实例化,这似乎不寻常,除非您的“User.rb”位于“models”以外的位置。通常情况下,开发中不会加载类,除非它们具体位于该目录中,但我使用的一种解决方案是,您可以将这一行放在代码中,您希望在出现问题的行之前调用它

Rails.application.eager_load! if Rails.env == "development"

条件部分可能是不必要的,但我加入它只是为了确定它的效果只发生在开发中。

第一部分做得对:

config.autoload_paths += %W(#{config.root}/lib)
接下来,它很重要,模块

module Foo
  ...
end
必须放入

lib/foo.rb
文件

然后,它可以
d包含到应用程序代码中

class Comment < ActiveRecord::Base
  include Foo
  ...
end

解决方案是,我在/lib中的文件实际上是rake文件所需要的,而且rake文件似乎是在Rails设置整个自动加载系统之前加载的,所以它找不到模型。从.rake文件中删除require后,一切都开始工作。

我知道这是一个老问题,但我刚刚遇到了同样的问题,经过一些搜索,我找到了一个解决方案,因此我认为值得分享

我想在我的/lib目录中的一个必需文件中使用模型“Foo”。首先,我这样做了,但没有成功:

# in my rake file
task :foo_task do
  require /some_path/lib/bar.rb
end

# in /lib/bar.rb
puts "Foo = #{Foo.count} "

# => uninitialized constant Foo
经过一些搜索后,我发现要访问lib文件中的模型,我需要在任务中指定环境。因此,我刚刚在我的任务声明中添加了以下内容:

task :foo_task => [:environment] do
现在,当我调用我的任务时,它正确地输入了Foo的数量:

# => Foo = 6

如何在rails应用程序中包含
lib
?在rails 3中,默认情况下它不是自动加载的,因此显示您如何访问
lib/foo.rb
会很有帮助。您是否包含此模块?如果是,它包含在哪里?@denis.peplin,不,我不需要,如果我需要它,我会得到一个文件找不到的错误。不需要,
包含它。请看我的答案,这对我不起作用。我尝试了几种变体,结果总是:uninitialized constant Foo::User。我不尝试从模型访问库,而是从库文件访问模型。因此,请尝试
require\u relative../config/environment.rb“
task :foo_task => [:environment] do
# => Foo = 6