Rails: Views: content_tag helpers - PullRequest
       33

Rails: Views: content_tag helpers

1 голос
/ 16 марта 2011

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

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 ]

3 голосов
/ 16 марта 2011

Потому что "" не был помечен как html_safe.Это часть защиты Rails XSS, которая по умолчанию включена в Rails 3.

Вы можете найти этот Railscast для защиты XSS информативным.

1 голос
/ 16 марта 2011

Оказывается, что при переходе с 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 - это то, что нужно, чтобы заставить ее работать.

Эндрю Маршалл указал мне правильное направление, и после некоторого поиска я наткнулся на слова мудрости от Иегуды . Вот где предложение :escape стало очевидным.

...