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 информативным.

Другие вопросы по тегам