2008-09-20 4 views

Respuesta

11

creo que haría uso de una biblioteca JSON rubí en @ruby_var para obtener la sintaxis de JS adecuada para la cadena y deshacerse de la '', Fex .:

res = foo(<%= @ruby_var.to_json %>) 

(después de requerir "json"' No estoy del todo seguro de cómo hacer eso en la página o si la sintaxis anterior es correcta ya que no he usado ese lenguaje de plantillas)

(por otro lado, si JSON alguna vez ha cambiado para ser incompatible con js that ' d romper, pero dado que una cantidad decente de código utiliza eval() para evaluar json, dudo que eso suceda pronto)

+0

Rails ya viene con String # to_json, entonces ni siquiera necesita incluir ninguna biblioteca: http://api.rubyonrails.com/classes/Object.html#M000022 – nertzy

+0

.to_json agrega comillas html (") a mi cadena – akabhirav

2
@ruby_var.gsub(/[']/, '\\\\\'') 

Eso escapará a la cita simple con un apóstrofo, ¡manteniendo su Javascript a salvo!

Además, si está en Rails, hay un grupo de Javascript-specific tools.

+0

¿Qué pasa si ya hay un \ en el código? Tienes que escapar \ antes de escapar '. – user11318

+0

Creo que bentilly tiene razón –

+0

Sí, para manejar el caso de Bentilly necesita: '@ ruby_var.gsub (/ ['\\] /,' \\\\\ 0 ')' – rampion

2

¿Podría simplemente poner la cadena en una comilla doble?

res = foo("<%= @ruby_var %>"); 
+0

, pero ¿qué ocurre si @ruby_var tiene una comilla doble? –

0

No trabajo con Ruby incrustado demasiado. Pero ¿qué tal el uso de p (que invoca inspect) en lugar de <%= que podría estar haciendo algo como print o puts. p siempre imprime la cadena como si estuviera envuelta código en comillas dobles:

>> p "String ' \" String" 
"String ' \" String" 
# => nil 
>> p 'alpha " \' alpha' 
"alpha \" ' alpha" 
# => nil 
2

También puede utilizar inspeccionar asumiendo que conoce que va a ser una comilla simple:

res = foo(<%= @ruby_var.inspect %>); 
8

Carriles ha dedicado específicamente método a esta tarea se encuentra en ActionView::Helpers::JavaScriptHelper llamado escape_javascript.

En su ejemplo, se utiliza la siguiente:

res = foo('<%= escape_javascript @ruby_var %>'); 

O mejor aún, utilizar el j atajo:

res = foo('<%= j @ruby_var %>'); 
0

es posible que desee utilizar la siguiente primera propiedad, a deshazte del "de tu cadena y luego puedes seguir adelante y usar tu función json.

res = foo('<%= @ruby_var %>.first'); 
Cuestiones relacionadas