繁体   English   中英

猴子修补 Rails tag_helper 方法

[英]Monkey patching a Rails tag_helper method

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 }

您可以在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

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

资料来源: 猴子修补实例方法时,您可以从新实现中调用覆盖的方法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM