典型模式:
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
?
典型模式:
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
?
我不会对此表示赞同,因为我认为这不是您正在寻找的答案。但我想无论如何我都会分享一些想法以供考虑。
这实际上可能更难阅读,但我有兴趣查看基准测试的结果与您的问题中使用的实现。
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}"
再一次,不是很可读,但我想我会把它扔在那里作为思考的食物。