【问题标题】:adding a method to built-in class in rails app在 Rails 应用程序中向内置类添加方法
【发布时间】:2009-03-24 11:38:19
【问题描述】:

我想在 Rails 应用程序中向 Array 类添加一个方法。我应该把这个方法放在哪里?

编辑更清楚,显然我把它放在某个文件中,但是我如何告诉 rails 应用程序在哪里可以找到它?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    一种方法是在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'
    

    您使用从属对象的里程可能会有所不同。

    【讨论】:

    • 这就是我想要的,谢谢。但是,我发现这仅在我将 require 行放在 config/environment.rb 的底部时才有效
    • 你很幸运在你的环境中有这样的服务性哈希和数组。
    • 另外值得注意的是,您可以在config/initializers/rails_extensions.rb 中添加您的扩展。这样,您就不必在environment.rb 中添加require。在 ruby​​ 2.6.4 和 rails 6 中测试。
    【解决方案2】:

    默认情况下,当您调用“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'”,它就会加载。

    【讨论】:

      【解决方案3】:

      只需将它放在一个新文件中,例如array_extended.rb

      class Array
      
        def my_new_method()
          ...
        end
      
      end
      

      之后,您可以使用require "array_extended.rb" 包含此文件。 确保您没有覆盖已经存在的方法,因为这可能会破坏其他功能。

      【讨论】:

      • 但是你在哪里放 require "array_extended.rb" ?这真的是我的问题。
      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      相关资源
      最近更新 更多