2010-11-05 2 views
6

Ich hatte vor kurzem ein Problem, den Wert zu verlassen, der durch einen Ertrag in einer Schablone zurückgegeben wird.Wie man den Wert retourniert, der durch einen Ertrag zurückgegeben wird

In meinem Layout, Ausbeute mir die Meta-Beschreibung, so dass ich es von meiner Vorlage

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

meine Vorlage definieren Und hier ist, dass unfortunatly, den Wert nicht entgehen, wie erwartet:

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

ich versuchte es mit dem h() escaper zu entkommen, aber es funktioniert nicht:

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

ich auch mit escape_once versucht(), aber es hat zu viel:

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

jedoch durch den zurückgegebenen Wert mit einer Zeichenfolge verketten, es behebt das Problem:

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

Versteht jemand dieses Verhalten ?

Haben Sie eine bessere Lösung als diese Verkettung, die es durch Zufall beheben?

Ich benutze Rails 2.3.8 - Danke!

+0

Hallo Haben Sie versucht escape_javascript Helfer? – Bohdan

+0

Nein, aber in diesem Kontext gibt es kein Javascript. – Guillaume

Antwort

4

die 'h' Funktion entkommt nur ungültigen HTML. Das Problem mit Ihrem Code ist, dass Zitate nicht ungültig HTML sind. Sonst könnten Sie keine Zitate irgendwo auf Ihrer Webseite haben. "h" ist es Dinge wie drehen "<Skript>" in "& lt; Skript & gt;" stattdessen.

so ... * Wellen Hand * Dies ist nicht die Methode, die Sie suchen.

Was es wahrscheinlich für Sie lösen wird, ist tatsächlich mit Rails-Methoden, um das Meta-Tag selbst zu erstellen - und dann werden Rails es für Sie schön entkommen.

zB wenn man versucht, die folgenden:

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

Sie würden am Ende:

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

Update:

Oh, und der Grund, warum String-Verkettung funktioniert das Trick ist, dass die neueren Versionen von Rails html-sicher sind, was es als eine schmutzige Zeichenkette betrachtet ... aber es ist ein Hack, den Sie nicht brauchen, wenn Sie eine railsy Weise verwenden, das Meta-Tag zu erzeugen.

+1

Ein Grund mehr für die Verwendung von Standard-Rails-Helfern und das Mischen von HTML mit Ruby-Code. Danke Taryn :) – Guillaume

+1

Große Antwort, danke! Hoffe es wird früher oder später akzeptiert. –

+0

Wahrscheinlich wird das nicht passieren ... aber hey, ich lasse die Leute wissen, was die S/O-Etikette ist, nur für den Fall, dass sie aufpassen. :) –

6

Für selbst geschlossene Tags wie Meta, Img oder Br können Sie die "Tag" -Methode verwenden.

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

Dies gibt Ihnen

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

Ich vergesse immer über diesen Helfer, aber es ist großartig dafür. –

0

Sie können die rohen() -Methode verwenden, um so etwas zu tun:

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