Rails: Views: content_tag helpers
У меня есть контроллер, который делает следующую строку перед рендерингом представления и выводом ошибки.
flash[:error]="Flash error"
flash[:info] = "Flash info"
Я хотел бы отформатировать это красиво. Для этого я написал помощник, который выглядит так
def show_flash
a=""
[:success, :info, :error, :warning].each do |key|
a += content_tag(:div, flash[key], :id => key, :class => "#{key}") unless flash[key].blank?
end
end
На мой взгляд, я звоню:
<%= show_flash %>
Когда я пытаюсь запустить это, веб-страница отображает полный текст show_flash, включая теги div, угловые скобки и все. Когда я проверяю элемент (используя Firefox или Chrome), он показывает текст в двойных кавычках.
Затем я попытался изменить одну строку в помощнике следующим образом:
a = content_tag(:div, flash[key], :id=>key, :class=>"#{key]") unless flash[key].blank?
то есть я бы захватил только последний тег контента (ошибка) вместо них обоих.
Во втором случае веб-браузер отображал тег div, отформатированный должным образом с моими правилами CSS для класса error. Я не видел никаких тегов div, напечатанных в браузере.
Почему объединение двух элементов content_tag вызвало у меня это горе?
Я ценю любую помощь, которую вы можете мне оказать.
2 ответа
Оказывается, при переходе с Rails 2 на Rails 3 html-экранирование включено по умолчанию, и вы должны явно отключить его перед объединением content_tag
строки. Код выглядит так:
def show_flash
a=content_tag(:span, "",:escape=>false)
[:success, :info, :error, :warning].each do |key|
a = a+content_tag(:div, flash[key], :id => key, :class => "#{key}", :escape=>false) unless flash[key].blank?
end
a
end
Этот вариант, :escape=>false
это то, что нужно, чтобы заставить его работать.
Andrew Marshall указал мне правильное направление, и после некоторого поиска я наткнулся на слова мудрости от Иегуды. Вот где :escape
пункт стал очевидным.
Так как ""
не был отмечен как html_safe
, Это часть защиты Rails от XSS, которая по умолчанию включена в Rails 3.
Вы можете найти этот Railscast по защите XSS информативным.