2

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

4

2 回答 2

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

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

于 2012-10-05T10:00:48.420 回答
2

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

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

然后在您的代码中,只要确保在任何使用它的地方都需要它。如果你想在任何地方应用它,config/initializers用一行创建一个初始化器:

require 'my_array'

my_array.rb文件的名称在哪里lib?这将使它在您的模型、控制器、视图等中可用。

另请参阅:从 Rails 3 中的 lib 文件夹加载模块/类的最佳方法?

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

于 2012-10-05T07:22:31.333 回答