2010-11-05 3 views
6

У меня недавно возникла проблема, чтобы избежать значения, возвращаемого доходностью в шаблоне.Как избежать значения, возвращаемого доходностью

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

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

А вот мой шаблон, который несчастливо, не ускользает значение, как и ожидалось:

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

Я пытался избежать его с ч() беглеца, но он не работает:

<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 - Спасибо!

+0

Привет Пробовали ли вы escape_javascript помощник? – Bohdan

+0

Нет, но в этом контексте нет javascript. – Guillaume

ответ

4

Функция «h» только ускользает от неверного html. Проблема с вашим кодом заключается в том, что кавычки не являются недопустимыми html. В противном случае вы не сможете иметь котировки на своей веб-странице. «h» должен делать что-то вроде поворота »< сценарий >« в »& lt; скрипт & gt;" вместо.

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

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

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

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

вы бы в конечном итоге с:

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

Update:

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

+1

Еще одна причина использования помощников по умолчанию rails и прекращения смешивания html с кодом ruby. Спасибо Taryn :) – Guillaume

+1

Отличный ответ, спасибо! Надеюсь, что это будет принято рано или поздно. –

+0

Наверное, этого не произойдет ... но эй, я позволил людям узнать, что такое этикетка S/O на всякий случай, когда они обращают внимание. :) –

6

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

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

Это дает

<meta content="&quot;I am surrounded by quotes&quot;" name="description" /> 
+0

Я всегда забываю об этом помощнике, но это здорово. –

0

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

<% microdata = "" %> 
<% microdata = "itemscope itemtype='#{yield :itemtype}'" if content_for? :itemtype %> 
<div class='container' <%= raw(microdata) %> > 
</div> 
Смежные вопросы