典型模式:
out = ''.html_safe # or ActiveSupport::SafeBuffer.new
out << content_tag(...) if foo
out << 'hello, 1 < 2' # will be escaped properly
out << content_tag(...) if bar
out
这很好用。是否有更好/更短/更好的方式,特别是调用''.html_safe
?
答案 0 :(得分:0)
我不会赞成这一点,因为我认为这不是你想要的答案。但我认为无论如何我都会分享一些想法。
这实际上可能更难阅读,但我有兴趣看到基准测试结果与您问题中使用的实现结果。
out = "#{content_tag(...) if foo}" <<
"hello, 1 < 2" <<
"#{content_tag(...) if bar}"
out.html_safe
另外,我不熟悉html_safe
如何知道最初设置与返回之前是否存在差异的内部结构。我猜测html_safe
的初始设置会更快,因为你复制了一个零长度的字符串而不是一个可能很长的字符串,但是为了参数:
out = '' # or ActiveSupport::SafeBuffer.new
out << content_tag(...) if foo
out << 'hello, 1 < 2' # will be escaped properly
out << content_tag(...) if bar
out.html_safe
考虑到这一点,我会考虑从上面修改我的原始代码,甚至更进一步:
"#{content_tag(...) if foo}".html_safe <<
"hello, 1 < 2" <<
"#{content_tag(...) if bar}"
同样,不是很可读,但我想我会把它扔出去作为思考的食物。