#ruby-on-rails #ruby-on-rails-3 #content-for
#ruby-on-rails #ruby-on-rails-3 #содержимое-для
Вопрос:
Используя Rails 3.0.6, я обнаружил, что в представлении, если я выполняю
content_for :food_name, "Macaroni amp; Cheese"
Затем, когда я верну его с помощью content_for(:food_name)
, то amp;
уже будет сделано amp;amp;
.
Не имеет значения, если я сделаю content_for(:food_name).html_safe
, amp;
все равно уже сделано amp;amp;
.
Но если это сделано следующим образом, то это не экранируется:
content_for :food_name, "Macaroni amp; Cheese".html_safe
В этом случае значение amp;
не изменится на amp;amp;
автоматически. Теперь, поскольку есть места, где
Я на самом деле делаю #{h content_for(:food_name)}
, и оно будет экранировано дважды (чтобы стать amp;amp;amp;
), или
поскольку у меня есть значения в <meta>
описании, будет странно вызывать h
некоторые значения и не вызывать его для некоторых других значений.
Кроме того, одна большая загвоздка в том, что, " - come see us!"
amp;
, он экранируется дважды, и что, если я добавлю его в конец и буду полагаться на Rails 3, чтобы экранировать его, то теперь, то, он экранируется дважды, и что, если я добавлю его в конец?
В content_for
документах:
http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for
Я не вижу никакого подобного описания. Итак, верно ли приведенное выше описание или документы более корректны — что на самом деле автоматического экранирования HTML не существует?
Похоже, что из исходного кода на приведенной выше веб-странице, content_for
вызывает capture
, и это выполняет ERB::Util.html_escape
, так что на самом деле автоматический экранирование существует, но должно ли оно быть на самом деле и почему? Также не задокументировано, что capture
выполняется автоматический экранирование?
Комментарии:
1. В боковой заметке для хранения простых значений (например, значения мета-тега) я часто использую переменную экземпляра вместо этого.
content_for
похоже, что он разработан с учетом фрагментов html.
Ответ №1:
Используйте <%= raw some_stuff %>
, когда вы не хотите, чтобы Rails экранировал эти символы, в противном случае используйте простой вызов.
Вы всегда знаете области, в которых может быть содержимое, которое может быть изменено в случае экранирования, поэтому вы можете просто вписаться raw
в эти места.
Для получения дополнительной информации обратитесь к этой действительно замечательной статье Иегуды Каца.
safebuffers-and-rails-3-0
Комментарии:
1. хотя есть некоторая другая информация, я надеялся получить некоторое представление о поведении
content_for