Ruby on Rails: как отобразить строку в виде HTML?

Я

@str = "<b>Hi</b>"

и в моем представлении erb:

<%= @str %>

что будет отображаться на странице: <b>Hi</b> когда то, что я действительно хочу-это Привет. Каков способ ruby "интерпретировать" строку как разметку HTML?


редактировать: в случае, когда

@str = "<span class="classname">hello</span>"

если на мой взгляд я делаю

<%raw @str %>

исходный код HTML <span class="classname">hello</span> где то, что я действительно хочу <span class="classname">hello</span> (без обратных косых черт, которые убегали двойная кавычка.) Каков наилучший способ "unescape" эти двойные кавычки?

9 ответов


обновление

по соображениям безопасности, рекомендуется использовать sanitize вместо html_safe. ссылке


происходит то, что в качестве меры безопасности Rails избегает вашей строки, потому что в нее может быть встроен вредоносный код. Но если вы скажете Rails, что ваша строка html_safe, он пройдет прямо через него.

@str = "<b>Hi</b>".html_safe
<%= @str %>

или

@str = "<b>Hi</b>"
<%= @str.html_safe %>

используя raw работает отлично, но все это это преобразование строки в строку, а затем вызов html_safe. Когда я знаю, что у меня есть строка, я предпочитаю вызывать html_safe напрямую, потому что он пропускает ненужный шаг и делает его более ясным, что происходит. Подробности о string-escaping и защите XSS находятся в это Asciicast.


использовать raw:

<%=raw @str >

но, как правильно говорит @jmort253, подумайте, где действительно принадлежит HTML.


Если вы rails использует erubis аппликации - самый крутой способ, чтобы сделать это

<%== @str >

обратите внимание на двойной знак равенства. посмотреть связанный вопрос на SO для получения дополнительной информации.


вы также можете использовать simple_format(@str), который удаляет вредоносный код. Подробнее читайте здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format


вы смешиваете свою бизнес-логику с вашим контентом. Вместо этого я бы рекомендовал отправить данные на вашу страницу, а затем использовать что-то вроде JQuery для размещения данных там, где вам нужно.

это имеет то преимущество, что все ваши HTML на HTML-страницах, где он принадлежит, так что ваши веб-дизайнеры могут изменить HTML позже без необходимости вливать через серверный код.

или если вы не хотите использовать JavaScript, вы можете попробовать это:

@str = "Hi"

<b><%= @str ></b>

по крайней мере, таким образом ваш HTML находится на странице HTML, где он принадлежит.


или вы можете попробовать CGI.unescapeHTML метод.

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"

поскольку вы переводите и выбираете нужный код из дерьмового закодированного файла человека, не могли бы вы использовать content_tag в сочетании с вашим регулярным выражением.

кража из документов api, вы можете интерполировать этот переведенный код в content_tag как:

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

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


@str = "<span class=\"classname\">hello</span>" Если, на мой взгляд, я это сделаю

<%raw @str %> Исходный код HTML <span class=\"classname\">hello</span> где то, что я действительно хочу-это <span class="classname">hello</span> (без обратных косых черт, которые избегали двойных > кавычек). Каков наилучший способ "unescape" эти двойные кавычки?

решение: используйте двойные кавычки внутри одинарных кавычек (или одинарные внутри двойных), чтобы избежать экранирования с обратной косой чертой.

@str = '<span class="classname">hello</span>'
<%raw @str %>

версия html_safe хорошо работает в Rails 4...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>