【问题标题】:Monkey patching a Rails tag_helper method猴子修补 Rails tag_helper 方法
【发布时间】:2021-03-10 15:46:45
【问题描述】:

Rails 6.1 发布了我现在需要的 tag_helper 改进(特别是 rich_text_area from ActionText),用于我的 Rails 6.0.x 应用程序。基本上改进只是一行代码的一个非常小的变化,所以只需猴子修补当前的 rails 方法并立即获得改进应该很简单,对吧?

具体来说,我正在尝试使用以下代码对以下ActionText tag helper method (link to 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 }

【问题讨论】:

  • 尝试将您的代码放入 initializers/action_view/helpers/tags.rb ;) 让我知道这是否可行
  • @AlexisClarembeau,没用。我没有打开课程,而是将第 2 行替换为 Tags::ActionText.class_eval do (因此,如果该课程尚不存在,它将失败)- id 做了什么。 RailsError:未初始化的常量 ActionView::Helpers::Tags::ActionText (NameError)。这可能是一个线索 - 但不确定如何从这里开始。

标签: ruby-on-rails ruby monkeypatching


【解决方案1】:

您可以在 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' 来解决

来源: When monkey patching an instance method, can you call the overridden method from the new implementation?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2017-02-12
    • 2015-03-23
    • 2012-03-13
    • 2013-12-26
    • 2012-06-14
    • 2012-03-29
    相关资源
    最近更新 更多