猴子修补 Rails tag_helper 方法
Monkey patching a Rails tag_helper method
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 }
您可以在 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'
[=15= 解决]
来源: When monkey patching an instance method, can you call the overridden method from the new implementation?
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 }
您可以在 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'
[=15= 解决]
来源: When monkey patching an instance method, can you call the overridden method from the new implementation?