我应该为Rails猴子补丁使用`lib`文件夹或`initializers`文件夹吗?

时间:2014-10-25 20:10:43

标签: ruby-on-rails ruby directory monkeypatching

我有一些函数可以在名为string_class.rb的文件中修补字符串类,该文件当前放在config\initializers\string_class.rb中。代码如下所示:

class String

  def capitalize_first_char
    self.sub(/^(.)/) { $1.capitalize }
  end

  def capitalize_each_sentence
    self.gsub(/([a-z])((?:[^.?!]|\.(?=[a-z]))*)/i) { $1.upcase + $2.rstrip }
  end

end

经过相当多的研究后,如果这个课程应该存在于初始化 lib 文件夹中,我就会陷入困境。

1 个答案:

答案 0 :(得分:1)

在Rails应用程序中生活这种东西并不是一个好地方,因为在构建Rails应用程序的正常过程中,这不是你应该做的事情。几乎每个样式指南中的修补核心类都是expressly advised against

  • config/initializers可能是错误的地方。通常这是为您的应用程序设置依赖关系,并且大多数人都不会考虑将代码混合到核心类中的奇怪方法
  • lib可能是一个更好的地方,但默认情况下不会自动重新加载
  • Gemfile?如果值得修补String,可能值得提炼成宝石并彻底记录。

我个人会回避这个问题并简单介绍帮助方法。您可以通过在app/controllers/application_controller.rb中定义辅助方法,在所有控制器上使用辅助方法。然后,您可以使用helper_method函数将方法用于您的视图:

class ApplicationController < ActionController::Base

  helper_method :capitalize_first_char, :capitalize_each_sentence

  #...

  protected

  def capitalize_first_char(str)
    str.sub(/^(.)/) { $1.capitalize }
  end

  def capitalize_each_sentence(str)
    str.gsub(/([a-z])((?:[^.?!]|\.(?=[a-z]))*)/i) { $1.upcase + $2.rstrip }
  end
end