2010-09-30 4 views
6

Ich habe ein Problem mit einer benutzerdefinierten Hilfsmethode in meiner Rails (3.0) -App, um das erforderliche HTML auszugeben.Rails View Helper HTML nicht einfügen in Seite

Ich habe folgenden Anruf in meiner Teilansicht: _label.html.erb

<% display_resource "Diamond", @resource.diamond %> 

Und in der resource_helper.rb Datei:

module ResourceHelper 
    def display_resource(display_name, value) 
     "<tr><td>#{display_name} </td><td>#{value.to_s}%</td></tr>" if value > 0 
    end 
end 

Die beabsichtigte Ausgabe lautet:

<tr> 
    <td>Diamond</td> 
    <td>15%</td> 
<tr> 

* gewährt, ohne die Formatierung, und die 15 ist beliebig

Wenn ich die <% = ...%> beim Methodenaufruf verwende, wird die Zeichenfolge korrekt ausgegeben, aber es wird kein HTML sein (dh ich sehe "<tr><td>Diamond </td><td>15%</td></tr>" im Gegensatz zu "Diamond 15 % ")

Was mache ich falsch?

+0

Hauptgrund, warum es nicht druckt, weil Sie '' <% %> statt '' <%= %> – klew

+0

Wenn ich <%=...%> würde es die Zeichenfolge ausgeben, aber es wäre die tatsächliche Zeichenfolge (wie das ist das Standardverhalten von Schienen jetzt - zu verhindern XSS und andere Art von Sicherheitslücken, die auftreten könnten) – MunkiPhD

Antwort

7

Sie müssen die Zeichenfolge zurückgegeben als „raw“ markieren und dann <% verwenden =%>

module ResourceHelper 
    def display_resource(display_name, value) 
     raw("<tr><td>#{display_name} </td><td>#{value.to_s}%</td></tr>") if value > 0 # string wrapped in raw 
    end 
end 
+0

Ich habe gerade eine App auf Rails 3 migriert , und ich möchte fragen: Dies ist ein neues Verhalten, wie Rails 3 HTML Safe Strings behandelt, richtig? – Robbie

+0

@Robbie - Ich glaube schon - also warum ich dieses Problem hatte (aber wusste nicht, wie es zu beheben ist. Danke für die Hilfe Rob! – MunkiPhD

+0

Ja, das ist die neue Art und Weise Schienen Text rendert. Standardmäßig alle Texte zwischen gerendert <%= .. %> ist escaped und Sie müssen rough() verwenden, wenn Sie etwas HTML haben, das angezeigt werden muss – danengle