我创建了一个文件,因此我可以在lib / foo / bar_woo.rb中的许多模型中共享一个方法。在bar_woo.rb里面我定义了以下内容:
module BarWoo
def hello
puts "hello"
end
end
然后在我的模型中我做了类似的事情:
def MyModel < ActiveRecord::Base
include Foo::BarWoo
def some_method
Foo::BarWoo.hello
end
end
解释器抱怨它希望bar_woo.rb定义Foo :: BarWoo。
Agile Web Development with Rails一书指出,如果文件包含类或模块,并且文件是使用类或模块名称的小写形式命名的,那么Rails将自动加载文件。因为这个原因,我没有要求它。
定义代码的正确方法是什么?在我的模型中调用代码的正确方法是什么?
答案 0 :(得分:5)
您可能想尝试:
module Foo
module BarWoo
def hello
puts "hello"
end
end
end
同样用于呼叫你不会用Foo::BarWhoo.hello
调用它 - 这必须使它成为一个类方法。但是include
该模块应该可以让您只使用hello
来调用它。
答案 1 :(得分:3)
默认情况下,/lib
的子目录中的文件不会自动require
。处理此问题最简洁的方法是在config/initializers
下添加一个新的初始值设定项,为您加载库模块。
在:config/initializers/load_my_libraries.rb
选择你想要的任何名字。
require(File.join(RAILS_ROOT, "lib", "foo", "bar_woo"))
一旦require
'结束,您应该可以随意include
。
答案 2 :(得分:3)
问题是双重的。
使用def self.hello
代替def hello
module Foo
module BarWoo
def self.hello
puts "hello"
end
end
end
答案 3 :(得分:1)
您也可以
module Foo::Barwoo; end;