Как избежать значения, возвращаемого доходностью - PullRequest
6 голосов
/ 05 ноября 2010

У меня недавно возникла проблема с экранированием значения, возвращаемого yield в шаблоне.

В моем макете я даю мета-описание, чтобы я мог определить его из моего шаблона

<meta name="description" content="<%= yield :html_description %>" />

А вот мой шаблон, который, к сожалению, не выходит за пределы ожидаемого значения:

<% content_for :html_description, 'hello "you" guy' %>
<meta name="description" content="hello "you" guy" />

Я пытался убежать с помощью h (), но он не работает:

<meta name="description" content="<%= h(yield :html_description) %>" />
<meta name="description" content="hello "you" guy" />

Я также пытался с escape_once (), но он делает слишком много:

<meta name="description" content="<%= escape_once(yield :html_description) %>" />
<meta name="description" content="hello &amp;quot;you&amp;quot; guy" />

Однако, объединяя возвращенное значение со строкой, это решает проблему:

<meta name="description" content="<%= '' + (yield :html_description) %>" />
<meta name="description" content="hello &quot;you&quot; guy" />

Кто-нибудь понимает это поведение?

Есть ли у вас лучшее решение, чем эта конкатенация, которая исправит его по совпадению?

Я использую Rails 2.3.8 - Спасибо!

Ответы [ 3 ]

6 голосов
/ 02 октября 2012

Для самозакрывающихся тегов, таких как meta, img или br, вы можете использовать метод "tag".

<%= tag(:meta, :name => 'description', :content => yield(:html_description)) %>

Это дает вам

<meta content="&quot;I am surrounded by quotes&quot;" name="description" />
4 голосов
/ 10 ноября 2010

функция 'h' экранирует только недопустимый html. Проблема с вашим кодом в том, что кавычки не являются недействительными HTML. В противном случае вы не могли бы иметь цитаты в любом месте на вашей веб-странице. «h» служит для того, чтобы превратить «» в «& lt; script & gt;» вместо этого.

так ... * машет рукой * это не тот метод, который вы ищете.

Что, вероятно, решит это за вас, так это использование методов rails для создания самого мета-тега - и тогда rails будет прекрасно его избегать.

например, если вы попробовали следующее:

<%= content_tag(:meta, nil, :name => 'description', :content => yield(:html_description)) %>

вы получите:

<meta content="hello &quot;you&quot; guy" name="description"></meta>

Обновление:

Да, и причина того, почему конкатенация строк делает свое дело, в том, что более новые версии Rails будут html-безопасными, что он считает грязной строкой ... однако, это хак, который нам не нужен, если Вы используете безрассудный способ генерации метатега.

0 голосов
/ 24 декабря 2013

Вы можете использовать метод raw (), чтобы сделать что-то вроде этого:

<% microdata = "" %>
<% microdata = "itemscope itemtype='#{yield :itemtype}'" if content_for? :itemtype %>
<div class='container' <%= raw(microdata) %> >
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...