1

典型模式:

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

4

1 回答 1

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}"

再一次,不是很可读,但我想我会把它扔在那里作为思考的食物。

于 2012-05-18T19:19:47.693 回答