2010-04-26 16 views
17

El método escape_javascript en ActionView escapa el apóstrofo ' como una barra invertida apostrofista \', que produce errores al analizar como JSON.Rails escape_javascript crea JSON no válido escapando comillas simples

Por ejemplo, el mensaje "Estoy aquí" es JSON válida cuando se imprimen en:

{"message": "I'm here"} 

Pero, <%= escape_javascript("I'm here") %> salidas "I\'m here", lo que resulta en JSON válido:

{"message": "I\'m here"} 

¿Existe una parche para solucionar esto, o una forma alternativa de escaparse de cadenas al imprimir en JSON?

Respuesta

10

Simplemente llame a .to_json en una cadena y se escapará correctamente, p.

"foo'bar".to_json 
+1

Esto no funciona si la cadena es HTML, por ejemplo, y tiene comillas dobles en la cadena, por ejemplo. – margusholland

+1

@margusholland - no es cierto - .to_json maneja el escape de comillas dobles perfectamente – Neall

+0

'" foo'bar ".to_json' outputs' "foo'bar" ' –

3

Puede que necesite más detalles aquí, pero las cadenas JSON deben usar comillas dobles. Las comillas simples están bien en cadenas de JavaScript, pero no en JSON.

+0

Gracias por la respuesta - añadí un ejemplo para mayor claridad. – Arrel

6

que terminó la adición de un nuevo método escape_json a mi application_helper.rb, basado en el método escape_javascript encontrado en ActionView::Helpers::JavaScriptHelper:

JSON_ESCAPE_MAP = { 
    '\\' => '\\\\', 
    '</' => '<\/', 
    "\r\n" => '\n', 
    "\n" => '\n', 
    "\r" => '\n', 
    '"'  => '\\"' } 

def escape_json(json) 
    json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] } 
end 

Alguien sabe de una solución mejor que esto?

+1

No sé mucho sobre Rails. Pero, ¿hay alguna manera de usar 'render: json' como se describe en http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-json y http://api.rubyonrails.org/classes/ActionController/Base. html –

+0

Eso funciona para convertir objetos, pero no está seguro de las cadenas. Lo investigaré ... – Arrel

+0

Lo único que he encontrado hasta ahora ha funcionado. No estoy seguro de por qué to_json decide escapar de las comillas con una sola barra invertida en lugar de doble, pero eso me tuvo por un tiempo. Gracias. – dChimento

5

tuve algunos problemas similares a esta, donde tenía que poner comandos JavaScript en la parte inferior de una plantilla de rieles, que puso cadenas en jQuery.data para su recuperación y uso posterior.

Cada vez que tenía una comilla simple en la cadena me sale un error de JavaScript al cargar la página.

Esto es lo que hice:

-content_for :extra_javascript do 
    :javascript 
    $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}"); 
Cuestiones relacionadas