Warm tip: This article is reproduced from serverfault.com, please click

ruby-猴子修补Rails tag_helper方法

(ruby - Monkey patching a Rails tag_helper method)

发布于 2020-11-27 22:23:14

Rails 6.1发布了对tag_helper(特别是ActionText中的rich_text_area)的改进,现在我需要对Rails 6.0.x应用程序进行改进。基本上,改进只是在一行代码中进行了很小的更改,因此只需简单修补当前的rails方法并立即获得改进,对吧?

具体来说,我正在尝试用以下代码猴子修补以下ActionText标签帮助器方法(链接到Github rails / rails),但未应用该代码。我究竟做错了什么?

lib / core_ext / rich_text_area.rb

module ActionView::Helpers
  class Tags::ActionText < Tags::Base

    def render
      options = @options.stringify_keys
      debugger
      add_default_name_and_id(options)
      options["input"] ||= dom_id(object, [options["id"], :trix_input].compact.join("_")) if object
      @template_object.rich_text_area_tag(options.delete("name"), options.fetch("value") { editable_value }, options.except("value"))
    end

  end
end

在文件中添加了以下内容 config/initializers

Dir[File.join(Rails.root, 'lib', 'core_ext', '*.rb')].each { |l| require l }
Questioner
fydelio
Viewed
0
Deep 2020-11-29 20:06:39

你可以在lib / core_ext / rich_text_area.rb文件中以更简洁的方式对猴子进行修补

require 'action_text/tag_helper'

module ActionTextOverride
  def render
    options = @options.stringify_keys
    add_default_name_and_id(options)
    options['input'] ||= dom_id(object, [options['id'], :trix_input].compact.join('_')) if object
    @template_object.rich_text_area_tag(options.delete('name'), options.fetch('value') { editable_value }, options.except('value'))
  end
end

class ActionView::Helpers::Tags::ActionText
  prepend ActionTextOverride

end

注意:RailsError: uninitialized constant ActionView::Helpers::Tags::ActionText (NameError)尝试使用时遇到的错误class_eval可以通过使用来解决require 'action_text/tag_helper'

来源: 当猴子修补实例方法时,可以从新的实现中调用重写的方法吗?