Rails 2.3.5:如何访问lib / directory / file.rb中的代码?

时间:2010-05-08 23:22:52

标签: ruby-on-rails ruby

我创建了一个文件,因此我可以在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将自动加载文件。因为这个原因,我没有要求它。

定义代码的正确方法是什么?在我的模型中调用代码的正确方法是什么?

4 个答案:

答案 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)

问题是双重的。

  1. 您需要使用外部Foo范围来定义BarWoo
  2. 您已将hello定义为实例方法,然后尝试在类上调用它。
  3. 使用def self.hello代替def hello

    定义您的方法
    module Foo
      module BarWoo
        def self.hello
          puts "hello"
        end
      end
    end
    

答案 3 :(得分:1)

您也可以

module Foo::Barwoo; end;