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 "<p>This is a Paragraph.</p>"
=> "<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? %
>