2012-03-13 5 views
11

He intentado todo. Cada combinación de los ayudantes raw, html_safeto_json incluyendo algunos intentos con ::JSON.encode y CGI.unescape. El problema es que, independientemente de lo que haga, no puedo imprimir JSON bien formado en una vista. Siempre es HTML escapado.Imprimir JSON válido y no escapado en una vista con Rails

Aquí está el código en mi opinión:

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

En mi caso, siempre las citas que se evitan como ". Simplemente haría un gsub en las citas, pero esa es una solución terrible para lo que IMO debería ser un caso de uso muy simple y bien documentado.

Respuesta

30

El problema aquí es con la cadena "=". Como se considera inseguro, contamina la otra cuerda.

es probable que pueda hacer cualquiera:

raw("=" + @campaign.to_json) 

o

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

que son más o menos lo mismo.

+1

Esto no es seguro. ¿Qué pasa si el json contiene una cuerda con un menor que? Si coloca esto en una etiqueta de script, alguien puede inyectar una etiqueta de script de cierre e iniciar una nueva con código arbitrario. Necesita envolver la cadena json en 'json_escape'. Sin embargo, esa función se ha roto hasta hace poco (rieles 4.1). – Kelvin

+0

Sí, también encontré que esto no funcionó cuando @campaign == "" – hrdwdmrbl

+0

GRACIAS A TON !!! –

5

¿Has probado escape_javascript?

Aquí hay un ejemplo del archivo * .haml, que acabo de agregar para probar mi respuesta.

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

Dónde j es un alias corto para escape_javascript.

+0

Sí, eso no funcionó. En este momento estoy simplemente imprimiendo manualmente cada valor que necesito, que es una solución horrible, pero es la única forma en que he podido hacer que funcione. –

+0

¿Podría pegar aquí un poco de su cadena escapada? Además, ¿qué versión de ruby ​​y raíles utilizas? Solo me preguntaba qué podría estar mal con eso – cutalion

+0

Era JSON válido, excepto que las comillas fueron reemplazadas con la entidad de cotización HTML '"' Using Rails 3.2.1 –

0

probar esto con utility method

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

Desde ActiveSupport 2.3.3 usted ha sido capaz de hacer .as_json

Cuestiones relacionadas