将 html 类 与 Ruby 助手中的默认值合并

Merge html classes with defaults in Ruby helper

我正在尝试编写一个 Ruby 助手来输出 SVG 精灵。

通过 options (class: "some-class") 传入的

类 似乎没有被合并和输出。

def ui_svg(icon_classes, size = false, options = {})

  options = {
    class: icon_classes,
    "aria-hidden" => true,
    role: "presentation",
    width: (size ? size : nil),
    height: (size ? size : nil)
  }

  content_tag(:svg, options.merge( options ) ) do
    content_tag(:use, nil, "xlink:href" => "#" + icon_classes)
  end

end

如果我只调用 = ui_svg "icon-envelope", 16 我得到正确的输出:

<svg class="icon-envelope" aria-hidden="true" role="presentation" width="16" height="16">
  <use xlink:href="#icon-envelope"></use>
</svg>

然而,当我用 = ui_svg "icon-envelope", 16, class: "some-class" 调用它时,icon-envelope 永远不会输出到第一个 content_tag;只有 some-class.

<svg class="some-class" aria-hidden="true" role="presentation" width="16" height="16">
  <use xlink:href="#icon-envelope"></use>
</svg>

如何保证通过options传入的icon_classes和类都在最外层content_tag输出?

您有两个同名的不同变量 options,一个来自方法参数列表,另一个在方法主体中定义。后者隐藏了前者。重命名其中一个变量。

def ui_svg(icon_classes, size = false, options = {})
  svg_tag_options = options.merge(
    :class => [icon_classes, options[:class]].reject(&:blank?).join(" "),
    "aria-hidden" => true,
    :role => "presentation",
    :width => (size ? size : nil),
    :height => (size ? size : nil)
  )

  content_tag(:svg, svg_tag_options) do
    content_tag(:use, nil, "xlink:href" => "#" + icon_classes)
  end 
end

更新

已更新代码以响应编辑后的问题。