【发布时间】:2017-09-05 19:28:04
【问题描述】:
我正在使用 Rails 的 content_tag 助手构建一段 HTML 代码。我现在面临的挑战是将数组中的 HTML 字符串与content_tag 生成的 HTML 元素连接起来。
RuboCop Rails/OutputSafety 参考。
例如:
options = ["<li>Three</li>", "<li>Four</li>", "<li>Five</li>"]
# This is code to generate blocks of HTML
out = []
out << content_tag(:ul,
content_tag(:li, "One") +
content_tag(:li, "Two") +
options.join(''),
:class => ["class_1", "class_2"])
safe_join(out)
# Expect result should be like
<ul class="class_1 class_2">
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
<li>Five</li>
</ul>
# Actual result
<ul class="class_1 class_2">
<li>One</li>
<li>Two</li>
"<li>Three</li><li>Four</li><li>Five</li>"
</ul>
但是,如果我使用下面的 html_safe 方法,它会起作用。
%{<ul>
<li>One</li>
<li>Two</li>
#{options.join('')}
</ul>
}.html_safe
对我应该改变什么有什么建议吗?
# New apporach
options = ["Three", "Four", "Five"]
out = []
out << content_tag(:ul,
content_tag(:li, "One") +
content_tag(:li, "Two") +
options.collect do |option|
content_tag(:li, "#{option[0]}")
end.join(""),
:class => ["class_1", "class_2"])
safe_join(out)
# New approach result
<ul class="class_1 class_2">
<li>One</li>
<li>Two</li>
"<li>Three</li><li>Four</li><li>Five</li>"
</ul>
【问题讨论】:
-
对于那些正在寻找替代和更安全的方法来用 safe_join 和 content_tag 助手替换 html_safe 的人。查看完整和描述性解决方案的答案。
标签: ruby-on-rails rubocop