【问题标题】:In Ruby on Rails, to extend the String class, where should the code be put in?在 Ruby on Rails 中,要扩展 String 类,代码应该放在哪里?
【发布时间】:2011-08-05 00:00:45
【问题描述】:

如果在 Ruby on Rails 上,我需要添加一个名为

的方法
class String
  def capitalize_first
    # ...
  end
end

想知道文件应该放在哪里? (哪个目录和文件名,是否需要初始化代码?)这是针对 Rails 3.0.6 项目的。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    你可以在 config/initializers/string.rb 中做到这一点

    class String
      def capitalize_first
        # ...
      end
    end
    

    应该是您所需要的(除了重新启动应用程序)。

    【讨论】:

    • 我很好奇你会在哪里为这个扩展添加一个测试文件?
    • 最简单的方法,是的。但是当您在开发中进行更改时,您会失去对重新加载此类的支持。
    【解决方案2】:

    我总是在我的lib 目录中添加一个core_ext 目录。

    创建一个initializer 用于加载自定义扩展(例如:config/initializers/core_exts.rb)。并在其中添加以下行:

    Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l }
    

    并让您的扩展程序如下:

    lib/core_ext/string.rb

    class String
      def capitalize_first
        # ...
      end
    end
    

    【讨论】:

    • 我想知道...我们应该扩展String 类还是只在视图中使用辅助方法?但是,如果是helper,那么让它在controller(或model)中工作也很麻烦,不能像s.capitalize_first.truncate(30)
    • 请原谅我的无知,但你能举一个“初始化配置”的例子吗?谢谢
    • 我放在 config/application.rb:class Application < Rails::Application ... config.autoload_paths += Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } ...
    • 如果您将扩展名放在lib/core_ext/string.rb 中,请不要忘记在使用它的文件顶部包含require 'core_ext/string'
    • @moondaisy 你错了。 lib 目录不应位于app 目录内。
    【解决方案3】:

    Rails 3.1 中的指导方针是要走的路:

    http://guides.rubyonrails.org/plugins.html#extending-core-classes

    如果你遵循默认约定,你就不需要搞乱初始化配置。

    【讨论】:

    • 此方法不会急切加载扩展。它在您调用模块/类名称后加载它(来自this rails guide,它是Yaffle)。这意味着在首先调用模块名称 (Yaffle) 之前,您将无法调用扩展方法,并且您无法在初始化程序中定义此模块名称。我已经在控制台中对其进行了测试,这就是 autoload_paths 的工作原理。在 config/initializers/ 或 config/application.rb 中要求扩展文件是最好的选择。
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多