我正在尝试编写一个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
上输出?
答案 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
代码已根据编辑过的问题进行了更新。