【发布时间】:2009-03-24 11:38:19
【问题描述】:
我想在 Rails 应用程序中向 Array 类添加一个方法。我应该把这个方法放在哪里?
编辑更清楚,显然我把它放在某个文件中,但是我如何告诉 rails 应用程序在哪里可以找到它?
【问题讨论】:
标签: ruby-on-rails ruby
我想在 Rails 应用程序中向 Array 类添加一个方法。我应该把这个方法放在哪里?
编辑更清楚,显然我把它放在某个文件中,但是我如何告诉 rails 应用程序在哪里可以找到它?
【问题讨论】:
标签: ruby-on-rails ruby
一种方法是在lib/rails_extensions.rb 创建一个文件。然后,像这样添加你的扩展:
class Array
def bring_me_food
# ...
end
def make_tea
# ...
end
end
class Hash
def rub_my_shoulders
# ...
end
end
然后在config/environment.rb 中添加:
require 'rails_extensions'
您使用从属对象的里程可能会有所不同。
【讨论】:
config/initializers/rails_extensions.rb 中添加您的扩展。这样,您就不必在environment.rb 中添加require。在 ruby 2.6.4 和 rails 6 中测试。
默认情况下,当您调用“require”时,Rails 会查找(来自 Rails 边缘源):
应用程序 应用程序/金属 应用程序/模型 应用程序/控制器 应用程序/助手 应用程序/服务 库 供应商
为简单起见,将文件放在 lib/ 中,并在 config/environment.rb 中按名称要求它,或者您可以将其放在 config/initializers/array_extension.rb 中,它会自动加载。
在我工作的地方,我们已将核心 Ruby 库的所有扩展放入一个插件中,并将其存储在 (Rails.root/)vendor/plugins/utilities/lib/core_ext 中,然后我们需要单独的插件的 init.rb 中的扩展。
另一种给这只猫换皮的方法:如果你说要将核心扩展存储在 Rails.root/core_ext 中,那么你可以将该路径作为加载路径添加到 environment.rb 中的配置块中:
Rails::Initializer.run do |config|
config.load_paths << 'core_ext'
end
然后你可以从任何地方调用“require 'array_extension'”,它就会加载。
【讨论】:
只需将它放在一个新文件中,例如array_extended.rb
class Array
def my_new_method()
...
end
end
之后,您可以使用require "array_extended.rb" 包含此文件。
确保您没有覆盖已经存在的方法,因为这可能会破坏其他功能。
【讨论】: