Экранирование HTML в представлении Rails 3

Я использую Rails 3. Я хочу отобразить сгенерированный фрагмент html внутри шаблона erb.

<%= "<div>Foo Bar</div>" %>

Rails кодирует теги div.

Если я прав, в Rails 2 <%=h вызывает экранирование html. Кажется, это было изменено в Rails 3. Как можно вставить фрагмент html без кодирования в Rails 3?

С уважением, Алексей.


person Alexey Zakharov    schedule 26.08.2010    source источник


Ответы (1)


Я предполагаю, что под кодировкой вы подразумеваете экранирование html:

Чтобы вывести необработанный html в Rails 3, вы можете использовать три разных подхода.

  1. вы можете использовать помощник raw для вывода необработанного html

    <% some_string = "<div>Hello World!</div>" %>
    <%= some_string %>
    <!-- outputs: &lt;div&gt;Hello Worlds!&lt;/div&gt; -->
    <%=raw some_string %>
    <!-- outputs: <div>Hello Worlds!</div> -->
    

    дополнительная информация: ActionView::Helpers::OutputSafetyHelper#raw< /а>

  2. Вы можете пометить строку как html_safe

    <% some_string = "<div>Hello World!</div>".html_safe %>
    <%= some_string %>
    <!-- outputs: <div>Hello World!</div> -->
    

    дополнительная информация: String#html_safe и ActiveSupport::SafeBuffer#new

  3. Вы можете очистить свой вывод с помощью sanitize

    <%=sanitize "<div>Hello World!</div>", tags: %w( div ) %>
    

    дополнительная информация: ActionView::Helpers::SanitizeHelper#sanitze< /а>

Еще немного информации:

person jigfox    schedule 26.08.2010
comment
Это правильно, но я думаю, что стоит отметить, что часто более безопасный способ сделать это — использовать <%= content_tag :div, "Hello World!" %> Это не включает какую-либо маркировку потенциально опасных строк как безопасных. - person AlexC; 15.10.2010
comment
Вы правы, если текст такой же простой, как в примере, но я считаю, что Hello World — это пример текста для чего-то, что ОП сохранил в БД, поэтому он не может использовать content_tag, потому что это также может быть что угодно, кроме <div/> содержащий все, и в этом div может быть любое количество html-тегов. если вы возьмете пример, самым простым и быстрым способом будет полностью передать erb и просто написать <div>Hello World</div> вне любого тега erb - person jigfox; 15.10.2010
comment
+1 для raw, если вам нужно короткое решение с условными параметрами тега: ‹td‹%=raw %/ class=cancelled/ if ticket.cancelled %››Билет номер 3‹/td› - person dimir; 26.07.2012
comment
не забывайте о sanitize, который используется так же, как и raw, но удаляет javascript и ненадежный контент! - person dtt101; 26.01.2013
comment
@ dtt101 Я обновил свой ответ информацией о sanitize - person jigfox; 10.03.2013