Rails 3.0.2 Array # присоединиться к HTML Безопасно? - PullRequest
9 голосов
/ 16 ноября 2010

У меня есть rails gem, который использует такой фрагмент кода:

components = []
components << label_for(attribute)
components << ...
components << text_field(attribute)
return components.join

Этот гем прекрасно работал в Rails 3.0.1, однако он экранирует (отображает как текст в браузере) весь HTML после обновления до Rails3.0.2.Что я делаю что-то не так?Спасибо.

Ответы [ 5 ]

12 голосов
/ 09 февраля 2012

Как указывает @ sj26, либо воспользуйтесь встроенным помощником rails:

<%= safe_join(components) %>

, либо используйте мой rails_join гем, чтобы сделать Array#join HTML безопасным,в этом случае ваш оригинальный код будет работать как есть.

9 голосов
/ 04 апреля 2011

String#join не SafeBuffer -осведомленный.

String#html_safe отмечает, что ваша строка уже экранирована HTML, что предотвращает проникновение пользователей на ваши страницы. Прочтите этот пост Иегуды Каца на SafeBuffer и почему / как вы должны их использовать.

Если у вас есть массив String и SafeBuffer, который вы хотите объединить, убедитесь, что вы запустили #html_safe для них всех или #concat их для SafeBuffer, например, так:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat
=> "&lt;one&gt;<p>two</p>" 

В Rails есть встроенный помощник safe_join, который сделает это за вас.

2 голосов
/ 14 октября 2011

http://makandra.com/notes/954-don-t-mix-array-join-and-string-html_safe

class Array
  def html_safe_join(delimiter='')
    ''.html_safe.tap do |str|
      each_with_index do |element, i|
        str << delimiter if i > 0
        str << element
      end
    end
  end
end
[safe_string, unsafe_string].html_safe_join(' ') 
# '<span>foo</span>&lt;span&t;bar&lt;/span&gt;'
1 голос
/ 16 ноября 2010

Строки автоматически экранируются HTML в Rails3. Вам нужно изменить эту последнюю строку на:

return components.join.html_safe

поочередно, если редактирование драгоценного камня слишком хлопотно, вы можете сделать это из вида:

<%= helper_name.html_safe %>
0 голосов
/ 09 июля 2012

как насчет ручного цитирования?

<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...