将 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
更新
已更新代码以响应编辑后的问题。
我正在尝试编写一个 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
更新
已更新代码以响应编辑后的问题。