2012-05-18 8 views
0

Типичная картина:Лучше, чем «.html_safe при создании строки html в Rails?

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

Я бы не поддержал это, так как я не думаю, что это действительно тот ответ, который вы ищете. Но я решил, что все равно буду делиться мыслями.

На самом деле, вероятно, труднее читать, но мне было бы интересно увидеть результаты теста или версию, используемую в вашем вопросе.

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

Опять же, не очень читаемый, но думал, что я бросить его там в качестве пищи для размышлений.

+0

Ваши первые два примера не будут выходить из '' '. У вас все еще есть 'html_safe' в вашем последнем, так что ничего не было получено ... –

+0

Я в замешательстве ... все 3 из них имеют вызовы' html_safe'. Возможно, я неправильно понял ваш первоначальный вопрос. Что вы пытаетесь выполнить (или избегать)? –

+0

'" ".html_safe +" <" # => "<" 'while' "<". Html_safe # => "<" ' –