ruby 如何覆盖`turbo_frame_tag`方法?

jgzswidk  于 2023-06-05  发布在  Ruby
关注(0)|答案(1)|浏览(271)

我正在使用Ruby on Rails 7和Turbo Rails gem,它提供了turbo_frame_tag方法。
我想给所有通过turbo_frame_tag生成的<turbo-frame>标签添加默认的html数据属性。也就是说,给定要添加的默认数据属性是data-custom="value",我想在每次使用turbo_frame_tag时生成以下HTML:

<turbo-frame id="..." data-custom="value">...</turbo-frame>

我如何在初始化器中实现它?

z8dt9xmd

z8dt9xmd1#

可以这样做。。首先在初始化器中定义自定义属性:

# config/initializers/custom_turbo_frame_attributes.rb
CustomTurboFrameAttributes = {foo: 'bar', baz: 'qux'}

然后覆盖Railsturbo_frame_tag视图帮助器以包含您的自定义属性。我通过在app/helpers/application_helper. rb中包含以下内容来实现这一点。可能有更干净的方法,但我没有花时间去找!

# app/helpers/application_helper.rb
module Turbo
  module FramesHelper
    def turbo_frame_tag(*ids, src: nil, target: nil, **attributes, &block)
      id = ids.map { |id| id.respond_to?(:to_key) ? ActionView::RecordIdentifier.dom_id(id) : id }.join("_")
      src = url_for(src) if src.present?
      attributes.merge!(CustomTurboFrameAttributes) # bingo! here are your custom attributes
      tag.turbo_frame(**attributes.merge(src: src, target: target).compact, &block)
    end
  end
end

这只是复制并更改以包含自定义属性的Turbo视图辅助对象。
另一种方法是定义一个名为custom_turbo_frame_tag的helper,并添加属性(定义如上)。然后,这种方法调用标准的ActionView turbo_frame_tag帮助器,因此,如果将来的Rails版本更改内置帮助器,它可能会工作得更好。

# app/helpers/application_helper.rb
module Turbo
  module FramesHelper
    def custom_turbo_frame_tag(*ids, src: nil, target: nil, **attributes, &block)
      attributes.merge!(CustomTurboFrameAttributes)
      turbo_frame_tag(ids, src: src, target: target, **attributes, &block)
    end
  end
end

相关问题