Ruby on rails 从Rails 3项目的lib目录中访问模型
我在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
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