2010-09-30 4 views
6

Ho riscontrato un problema utilizzando un metodo di supporto personalizzato nella mia app Rails (3.0) per generare l'html richiesto.Rails Visualizza Helper non inserendo HTML nella pagina

Ho la seguente chiamata a mio avviso parziale: _label.html.erb

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

E nel file resource_helper.rb:

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

L'output previsto è:

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

* concesso, senza la formattazione, e il 15 è arbitrario

Se utilizzo il metodo <% = ...%> quando si esegue la chiamata al metodo, verrà restituita correttamente la stringa, ma non sarà html % ")

Cosa sto facendo in modo errato?

+0

motivo principale per cui non è la stampa è perché si utilizza '' <% %> invece di '' <%= %> – klew

+0

Se avessi usato <%=...%>, emetterebbe la stringa, ma sarebbe la stringa effettiva (poiché questo è il comportamento predefinito dei binari ora - per prevenire XSS e altri tipi di falle che potrebbero sorgere) – MunkiPhD

risposta

7

è necessario marcare la stringa restituita come "raw" e quindi utilizzare <% =%>

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

Ho appena trasferito un'app a Rails 3 , e vorrei chiedere: questo è un nuovo comportamento nel modo in cui Rails 3 tratta le stringhe HTML Safe, corretto? – Robbie

+0

@Robbie - Credo di sì - quindi perché ho avuto questo problema (ma non sapevo come correggerlo.) Grazie per l'aiuto Rob! – MunkiPhD

+0

Sì, questo è il nuovo modo in cui il testo rota rende il testo. <%= .. %> è escaped ed è necessario utilizzare raw() se si dispone di un html che deve essere visualizzato – danengle