Ruby on Rails: как визуализировать строку как HTML?
У меня
@str = "<b>Hi</b>"
и в моем представлении erb:
<%= @str %>
Что будет отображаться на странице: <b>Hi</b>
, когда я действительно хочу, Hi. Какой рубиновый способ "интерпретировать" строку как разметку HTML?
Изменить: случай, когда
@str = "<span class=\"classname\">hello</span>"
Если, на мой взгляд, я
<%raw @str %>
Исходный код HTML <span class=\"classname\">hello</span
> , где я действительно хочу <span class="classname">hello</span>
(без обратных косых черт, которые избегали двойных кавычек). Какой лучший способ "unescape" эти двойные кавычки?
Ответы
Ответ 1
Что происходит, так как в качестве меры безопасности Rails ускользает от вашей строки, потому что в ней может быть встроен вредоносный код. Но если вы сообщите Rails, что ваша строка html_safe
, она пройдет через нее.
@str = "<b>Hi</b>".html_safe
<%= @str %>
ИЛИ
@str = "<b>Hi</b>"
<%= @str.html_safe %>
Использование raw
отлично работает, но все, что он делает, - это преобразование строки в строку, а затем вызов html_safe. Когда я знаю, что у меня есть строка, я предпочитаю напрямую обращаться к html_safe, потому что он пропускает ненужный шаг и делает более понятным, что происходит. Подробности об экранировании строк и защите XSS находятся в this Asciicast.
Ответ 2
Используйте raw:
<%=raw @str >
Но, как правильно говорит @jmort253, рассмотрите, где действительно принадлежит HTML.
Ответ 3
Если вы находитесь на rails
, который использует Erubis - самый крутой способ сделать это -
<%== @str >
Обратите внимание на знак двойного равенства. См. соответствующий вопрос о SO для получения дополнительной информации.
Ответ 4
Вы также можете использовать simple_format(@str)
, который удаляет вредоносный код. Подробнее здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format
Ответ 5
Вы смешиваете свою бизнес-логику с вашим контентом. Вместо этого я бы рекомендовал отправить данные на вашу страницу, а затем использовать что-то вроде JQuery для размещения данных, в которых вам это нужно.
Это имеет то преимущество, что вы сохраняете весь свой HTML-код на страницах HTML, где он принадлежит, поэтому ваши веб-дизайнеры могут впоследствии модифицировать HTML-код без необходимости заливать серверный код.
Или, если вы не хотите использовать JavaScript, вы можете попробовать следующее:
@str = "Hi"
<b><%= @str ></b>
По крайней мере, ваш HTML-код находится на странице HTML, где он принадлежит.
Ответ 6
Или вы можете попробовать CGI.unescapeHTML.
CGI.unescapeHTML "<p>This is a Paragraph.</p>"
=> "<p>This is a Paragraph.</p>"
Ответ 7
так как вы переводите и выбирая свой желаемый код из файла crappy закодированного человека, можете ли вы использовать content_tag в сочетании с вашим регулярным выражением.
Крадуясь из api docs, вы можете интерполировать этот переведенный код на content_tag
как:
<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>
Не зная ваш код, такое мышление будет гарантировать, что ваш переведенный код слишком уступчив.
Ответ 8
@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 %>
Ответ 9
Версия html_safe хорошо работает в Rails 4...
<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>