2010-11-05 10 views
6

J'ai récemment eu un problème pour échapper la valeur retournée par un rendement dans un gabarit.Comment échapper la valeur retournée par un rendement

Dans ma mise en page, je cède la meta description afin que je puisse le définir à partir de mon modèle

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

Et voici mon modèle, que unfortunatly, n'échappe pas à la valeur comme prévu:

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

J'ai essayé d'échapper avec l'h() escaper, mais cela ne fonctionne pas:

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

J'ai aussi essayé avec escape_once(), mais il en fait trop:

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

Cependant, en concaténant la valeur retournée par une chaîne, il résout le problème:

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

Quelqu'un comprend ce comportement ?

Avez-vous une meilleure solution que cette concaténation qui corrige par coïncidence? J'utilise Rails 2.3.8 - Merci! Je m'appelle Rails 2.3.8 - Merci!

+0

Salut Avez-vous essayé aide escape_javascript? – Bohdan

+0

Non, mais il n'y a pas de javascript dans ce contexte. – Guillaume

Répondre

4

La fonction 'h' échappe uniquement au code html invalide. Le problème avec votre code est que les citations ne sont pas invalides html. Sinon, vous ne pouvez pas avoir de guillemets nulle part dans votre page Web. "h" est là pour faire des choses comme tourner "<script>" dans "& lt; script & gt;" au lieu.

si ... * vagues main * ce n'est pas la méthode que vous recherchez. Ce qui résoudra probablement cela pour vous, c'est d'utiliser des méthodes de rails pour créer la méta-étiquette elle-même - et les rails s'en échapperont bien pour vous.

par exemple, si vous avez essayé les éléments suivants:

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

vous finiriez avec:

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

Mise à jour:

Oh, et la raison pour laquelle la chaîne concaténation-ce que la astuce est que les versions les plus récentes de Rails html-safe ce qu'il considère comme une chaîne sale ... Cependant, c'est un hack dont vous n'avez pas besoin si vous utilisez une manière linéaire de générer le meta tag.

+1

Une raison de plus pour utiliser les aides de rails par défaut, et arrêter de mélanger le html avec le code ruby. Merci Taryn :) – Guillaume

+1

Bonne réponse, merci! J'espère que cela sera accepté tôt ou tard. –

+0

Probablement ne se produira pas ... mais bon, je fais savoir aux gens ce que l'étiquette S/O est juste au cas où ils sont attentifs. :) –

6

Pour les étiquettes auto-fermées telles que meta, img ou br, vous pouvez utiliser la méthode "tag".

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

Cela vous donne

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

J'oublie toujours cette aide, mais c'est génial pour ça. –

0

Vous pouvez utiliser la méthode brute() de faire quelque chose comme ceci:

<% microdata = "" %> 
<% microdata = "itemscope itemtype='#{yield :itemtype}'" if content_for? :itemtype %> 
<div class='container' <%= raw(microdata) %> > 
</div> 
Questions connexes