Ruby on Rails: как отобразить строку в виде HTML? - PullRequest
146 голосов
/ 02 января 2011

У меня есть

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

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

<%= @str %>

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


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

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

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

<%raw @str %>

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

Ответы [ 9 ]

316 голосов
/ 02 января 2011

UPDATE

В целях безопасности рекомендуется использовать sanitize вместо html_safe. Ссылка


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

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

OR

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

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

16 голосов
/ 02 января 2011

Использование raw :

<%=raw @str >

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

12 голосов
/ 08 декабря 2013

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

<%== @str >

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

8 голосов
/ 13 марта 2013

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

7 голосов
/ 02 января 2011

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

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

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

@str = "Hi"

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

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

6 голосов
/ 06 июня 2013

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

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"
0 голосов
/ 27 октября 2014

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

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
0 голосов
/ 08 октября 2013

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

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

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

0 голосов
/ 02 января 2011

, поскольку вы переводите и выбираете нужный код из дрянного закодированного файла, можете ли вы использовать 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...