2010-11-16 12 views
9

Ho un gioiello rotaie che utilizza un frammento come:Rails 3.0.2 L'array # unisce HTML sicuro?

components = [] 
components << label_for(attribute) 
components << ... 
components << text_field(attribute) 
return components.join 

La gemma ha funzionato bene in Rails 3.0.1, tuttavia sfugge (rende come testo in un browser) tutto il codice HTML dopo l'aggiornamento a Rails 3.0.2 . Cosa sto facendo qualcosa di sbagliato? Grazie.

risposta

12

Come @ sj26 sottolinea, utilizzare le guide built-in aiuto:

<%= safe_join(components) %> 

Oppure utilizzare il mio rails_join gemma per fare Array#join HTML-safe consapevole, nel qual caso il tuo codice originale funzionerà così com'è.

+0

nb safe_join è stato aggiunto nei binari 3.1 – robd

1

Le stringhe vengono automaticamente convertite in HTML in Rails3. È necessario cambiare questa ultima riga a:

return components.join.html_safe 

In alternativa, se si modifica la gemma è troppo fastidio lo si può fare dal punto di vista:

<%= helper_name.html_safe %> 
+0

Grazie per la risposta. Non ho avuto problemi con Rails 3.0.1 con 'join' (usando la nuova HTML-escape). Qualche ragione per cui non riesce specificamente in Rails 3.0.2? Grazie. –

+0

Ho creato un'app super semplice per testare il tuo problema e ho scoperto che 3.0.1 si comporta per me mentre stai dicendo che 3.0.2 lo fa. Entrambi sfuggono all'html a meno che non lo dica (l'ho fatto usando il metodo "raw" nel mio helper) – jwarchol

+0

Grazie JW e Adam. Ho appena fatto un test e tu hai ragione. Non sono sicuro del motivo per cui la mia gemma ha funzionato per l'ultima mezza dozzina di versioni, ma questo risolve il mio problema. Saluti! –

9

String#join non è SafeBuffer -consapevoli.

String#html_safe indica che la stringa è già in formato HTML, impedendo agli utenti di inserire frammenti di HTML nelle pagine. Dai un'occhiata a this post di Yehuda Katz su SafeBuffer e perché/come dovresti usarli.

Se si dispone di una vasta gamma di String e SafeBuffer si desidera concatenare, accertarsi di aver eseguito #html_safe su tutti loro, o li #concat in un SafeBuffer in questo modo:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat 
=> "&lt;one&gt;<p>two</p>" 

Rails ha un incorporato in helper chiamato safe_join che farà questo per voi.

+1

Questa è la risposta migliore a mio parere. Unirsi sembra essere intrinsecamente pericoloso. Solo una domanda su ".html_safe. È giusto nel caso che la prima stringa nell'array non sia stata contrassegnata come html_safe? Inoltre, qual è la differenza tra &: concat e: concat, quest'ultimo sembra funzionare allo stesso modo per me :) –

+2

La risposta più corretta è ora di usare ['safe_join (array)'] [http://apidock.com/ rails/ActionView/Helpers/OutputSafetyHelper/safe_join] che è 'Array # join' che comprende' SafeBuffer'. – sj26

0

come su virgolette manuali?

<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>