raw против html safe против h для unescape html
Предположим, у меня есть следующие строки
@x = "<a href='#'>Turn me into a link</a>"
на мой взгляд, я хочу, чтобы ссылка отображалась. То есть, я не хочу, чтобы все в @x было unescaped и отображалось как строка. В чем разница между использованием
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
6 ответов
Учитывая Рельсы 3:
html_safe
на самом деле" устанавливает строку " как HTML Safe (это немного сложнее, чем это, но в основном это). Таким образом, Вы можете возвращать HTML-Безопасные строки из помощников или моделей по желанию.
h
может использоваться только из контроллера или представления, так как он от помощника. Это заставит выход быть экранированным. Это не очень устарело, но вы, скорее всего, больше не будете использовать его: единственное использование - "вернуть"html_safe
заявление, довольно необычное.
предваряя ваше выражение с raw
фактически эквивалентно вызову to_s
между html_safe
на нем, но объявляется на хелпере, так же как h
, поэтому его можно использовать только на контроллерах и представлениях.
"SafeBuffers и рельсы 3.0" - это хорошее объяснение того, как SafeBuffer
s (класс, который делает html_safe
магия) работы.
думаю, стоит повторить:html_safe
тут не HTML-escape вашей строки. Фактически, это предотвратит экранирование вашей строки.
<%= "<script>alert('Hello!')</script>" %>
положим:
<script>alert('Hello!')</script>
в ваш источник HTML (yay, так безопасно!), в то время как:
<%= "<script>alert('Hello!')</script>".html_safe %>
появится диалоговое окно предупреждение (вы уверены, что это то, что вы хотите?). Поэтому вы, вероятно, не хотите звонить html_safe
на любых введенных пользователем строках.
разница между рельсами'html_safe()
и raw()
. На этом есть отличный пост Иегуды Каца, и он действительно сводится к этому:
def raw(stringish)
stringish.to_s.html_safe
end
да raw()
обертка вокруг html_safe()
это заставляет вход в строку, а затем вызывает html_safe()
на нем. Это также тот случай, что raw()
является помощником в модуле, тогда как html_safe()
- Это метод класса String, который создает новый экземпляр ActiveSupport:: SafeBuffer-который имеет @dirty
флаг в он.
смотрите на "Html_safe Rails против raw".
-
html_safe
:отмечает строку как надежный сейф. Он будет вставлен в HTML без дополнительного экранирования.
"<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe' for nil:NilClass
-
raw
:raw
- это просто обертка вокругhtml_safe
. Использоватьraw
Если есть шансы, что эта строка будетnil
.raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
-
h
псевдонимhtml_escape
:метод утилиты для экранирования символов тегов HTML. Используйте этот метод, чтобы избежать любого опасного контента.
в Rails 3 и выше он используется по умолчанию, поэтому вам не нужно использовать этот метод явно
в простых терминах рельсы:
h
удалите HTML-теги в числовые символы, чтобы рендеринг не нарушил ваш html
html_safe
задает логическое значение в строке, чтобы строка рассматривалась как HTML save
raw
он преобразуется в html_safe в string