在Ruby帮助器中使用默认值合并html类

时间:2015-10-18 01:38:08

标签: html ruby-on-rails ruby helper params

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

通过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>

如何确保通过icon_classes传递的options和类在最外面的content_tag上输出?

1 个答案:

答案 0 :(得分:4)

您有两个具有相同名称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

更新

代码已根据编辑过的问题进行了更新。