I wouldn't upvote this, as I don't think it's really the answer you're looking for. But I figured I'd share some thoughts for consideration anyway.
This is actually probably harder to read, but I would be interested in seeing the results of a benchmark vs. the implementation used in your question.
out = "#{content_tag(...) if foo}" <<
"hello, 1 < 2" <<
"#{content_tag(...) if bar}"
out.html_safe
Also, I'm not familiar with the internals of how html_safe
to know whether there's a difference in setting it as so initially vs. prior to returning. I'm guessing initial setting of html_safe
would be faster since you're duplicating a zero-length string instead of a potentially long string, but for the sake of argument:
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
With that in mind, I would consider modifying my original code from above to even take it a step further:
"#{content_tag(...) if foo}".html_safe <<
"hello, 1 < 2" <<
"#{content_tag(...) if bar}"
Again, not very readable, but thought I'd throw it out there as food for thought.