rails应用程序中类的位置

时间:2012-10-05 07:12:10

标签: ruby ruby-on-rails-3

我想扩展Array的功能,添加一个方法来检查数组中是否存在键,并且数组不为空,在哪里编写类以及如何确保它已加载?

2 个答案:

答案 0 :(得分:3)

您可以将其放入lib/并确保按照shioyama的回答中所述进行自动加载;或者你可以把它放入初始化器。我更喜欢初始化方法,因为它更容易(你可以免费自动加载)。

我通常会创建core_ext目录的initializers子目录,并将核心类扩展放在那里。我总是试着把正在扩展的类的名称和我添加到文件名中的内容的描述,所以在你的情况下我会创建一个文件RAILS_ROOT/config/initializers/core_ext/array_my_function,其中包含:

module MyFunctionForArray
  def my_function(arg1, arg2)
    # ...
  end
end

Array.send :include, MyFunctionForArray

我总是尝试不重新打开该类并直接扩展它,但是将我的扩展放入一个模块中,然后将该模块包含在类中以进行扩展。

答案 1 :(得分:2)

执行此操作的标准方法是将代码放在lib/中,并通过向config/application.rb添加一行来确保它由rails自动加载:

config.autoload_paths += Dir["#{config.root}/lib/**/"]

然后在您的代码中,确保无论您在何处使用它都需要它。如果要在任何地方应用它,请在config/initializers中使用以下行创建初始值设定项:

require 'my_array'

其中my_array.rb是您拥有该文件的lib中文件的名称。这将使其在您的模型,控制器,视图等中可用。

另请参阅:Best way to load module/class from lib folder in Rails 3?

另外,请注意在ruby中自动加载目录结构的一个陷阱(不仅仅是rails),在这个答案中解释:Best way to load module/class from lib folder in Rails 3?