У меня
@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" эти двойные кавычки?
Что происходит, так как в качестве меры безопасности 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.
raw
. Очень рад узнать об этом!
Используйте raw:
<%=raw @str >
Но, как правильно говорит @jmort253, рассмотрите, где действительно принадлежит HTML.
Вы также можете использовать 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>"
Версия html_safe хорошо работает в Rails 4...
<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
@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 %>
так как вы переводите и выбирая свой желаемый код из файла 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>
Не зная ваш код, такое мышление будет гарантировать, что ваш переведенный код слишком уступчив.
translated_text
.
%Q["quotation marks"] => "\"quotation marks\""
Источник: en.wikibooks.org/wiki/Ruby_Programming/Syntax/… Не знаю, поможет ли это.