Функция content_for в Ruby on Rails будет выполнять автоматическую экранировку HTML?

#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