Ruby on rails 我应该使用'lib'文件夹还是'initializers'文件夹作为Rails猴子补丁?

Ruby on rails 我应该使用'lib'文件夹还是'initializers'文件夹作为Rails猴子补丁?,ruby-on-rails,ruby,directory,monkeypatching,Ruby On Rails,Ruby,Directory,Monkeypatching,我有几个函数可以在名为string\u class.rb的文件中对字符串类进行修补,该文件当前位于config\initializers\string\u class.rb中。代码如下所示: class String def capitalize_first_char self.sub(/^(.)/) { $1.capitalize } end def capitalize_each_sentence self.gsub(/([a-z])((?:[^.?!]|\.

我有几个函数可以在名为
string\u class.rb
的文件中对字符串类进行修补,该文件当前位于
config\initializers\string\u 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文件夹中持怀疑态度。

在Rails应用程序中没有一个适合这种事情的地方,因为在构建Rails应用程序的正常过程中,你不应该这样做。修补核心类几乎出现在每一个样式指南中

  • config/initializers
    可能是执行此操作的错误位置。通常,这是为了设置应用程序的依赖项,大多数人不会想到在那里寻找将奇怪的方法混合到核心类中的代码
  • lib
    可能是一个更好的地方,但默认情况下它不会自动重新加载
  • Gemfile
    ?如果这值得修补成
    字符串
    ,那么它可能值得提炼成宝石并彻底记录下来
我个人会避开这个问题,简单地介绍helper方法。通过在
app/controllers/application\u controller.rb
中定义助手方法,可以使助手方法在所有控制器中都可用。然后,您可以使用以下功能使视图可以使用这些方法:

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
class ApplicationController
顺便说一句,这些都不适合修补字符串。它们(大概)纯粹是为了展示。你只需要在app/helpers/*\u helper.rb@meagar中编写helper函数,我希望它们在所有控制器和视图中都可用,这样helpers就可以了,对吗?不,这是对helper的一个非常正常的要求。如果控制器需要它们,只需在
ApplicationController
中定义方法即可。这使得所有控制器都可以使用它们,而不是从
应用程序控制器继承,后者应该是所有控制器。然后指定它们是具有的辅助方法,并且它们在每个视图中都可用。@meagar我更喜欢这个想法,我将把它们移到那里。如果你想在下面添加一个答案,我会给你一个学分:)在核心课程中胡闹几乎总是一个坏主意。字符串就是字符串,每个Ruby开发人员都希望它们以某种方式运行。将新方法修补到字符串中意味着您的字符串的行为与其他字符串稍有不同。这也意味着,如果一个新版本的Ruby引入了一个同名的方法(不太可能,无可否认),您的代码将突然隐藏一个真正的字符串方法。在实践中,当有实际需要时,可以适度地修补核心类。这不是那种情况。我喜欢这是怎么回事,但还有最后一个问题。这些助手是属于应用程序控制器还是可以进入应用程序助手?@meager我让它工作了,我有一个坏的拷贝和粘贴。谢谢您在这方面的帮助。@chrishough虽然控件中没有ApplicationHelper方法,但它们只用于视图。如果您在控制器和视图中都需要它们,它们应该进入控制器,并通过
helper\u方法提供给视图。