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 для получения дополнительной информации.

Ответ 5

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

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

Или, если вы не хотите использовать JavaScript, вы можете попробовать следующее:

@str = "Hi"

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

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

Ответ 6

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

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<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? %
>