2012-03-13 16 views
11

Ho provato di tutto. Ogni combinazione degli helper raw, html_safeto_json compresi alcuni tentativi con ::JSON.encode e CGI.unescape. Il problema è che indipendentemente da ciò che faccio, non riesco a stampare JSON ben formato in una vista. È sempre in codice HTML.Stampa JSON valida, senza escape in una vista con Rails

Ecco il codice a mio avviso:

var campaignData<%= "=" + (raw @campaign.to_json) if @campaign %>;

Nel mio caso, è sempre le virgolette che sono sfuggiti come ". Vorrei solo fare un gsub sulle virgolette, ma questa è una terribile soluzione a ciò che IMO dovrebbe essere un caso d'uso molto semplice e ben documentato.

risposta

30

Il problema qui è con il "=" stringa. Poiché è considerato non sicuro, tinge l'altra stringa.

probabilmente si può fare sia:

raw("=" + @campaign.to_json) 

o

"= #{@campaign.to_json}".html_safe 

, che sono più o meno lo stesso.

+1

Questo non è sicuro. Cosa succede se il json contiene una stringa con un numero minore di? Se lo metti in un tag script, qualcuno può iniettare un tag di script di chiusura e avviarne uno nuovo con un codice arbitrario. È necessario avvolgere la stringa json in 'json_escape'. Tuttavia, tale funzione è stata interrotta fino a poco tempo fa (rotaie 4.1). – Kelvin

+0

Sì, ho anche scoperto che questo non ha funzionato per me quando @campaign == "" – hrdwdmrbl

+0

THANKS A TON !!! –

5

Hai provato escape_javascript?

Ecco un esempio del file * .haml, che ho appena aggiunto per testare la mia risposta.

:javascript 
    var foo=$.parseJSON("#{j @albums.to_json}") 

Dove j è un breve alias per escape_javascript.

+0

Sì, che non ha funzionato. In questo momento sto stampando manualmente ogni valore di cui ho bisogno, che è una soluzione terribile, ma è l'unico modo in cui sono riuscito a farlo funzionare. –

+0

Potresti incollare qui un po 'della tua stringa di escape? Inoltre, quale versione di ruby ​​e rail usi? Mi chiedo cosa potrebbe esserci di sbagliato in questo – cutalion

+0

Era JSON valido, eccetto che le virgolette erano state sostituite con l'entità dell'omologazione HTML '"' Uso di Rails 3.2.1 –

0

Prova questa con utility method

var campaignData<%=h " =#{raw @campaign.to_json}" if @campaign %>; 
9

Dal ActiveSupport 2.3.3 siete stati in grado di fare .as_json

Problemi correlati