views:

907

answers:

5

I have this line in a javascript block in a page:

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

What is the best way to handle the case where @ruby_var has a single-quote in it? Else it will break the js code.

+1  A: 
@ruby_var.gsub(/[']/, '\\\\\'')

That will escape the single quote with an apostrophe, keeping your Javascript safe!

Also, if you're in Rails, there are a bunch of Javascript-specific tools.

Max
What if there was a \ already in the code? You need to escape \ before you escape '.
i think bentilly is right
Yoni Baciu
yeah, to handle bentilly's case you need: `@ruby_var.gsub(/['\\]/, '\\\\\0')`
rampion
+5  A: 

I think I'd use a ruby JSON library on @ruby_var to get proper js syntax for the string and get rid of the '', fex.:

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

(after require "json"'ing, not entirely sure how to do that in the page or if the above syntax is correct as I havn't used that templating language)

(on the other hand, if JSON ever changed to be incompatible with js that'd break, but since a decent amount of code uses eval() to eval json I doubt that'd happen anytime soon)

TFKyle
Rails already comes with String#to_json, so you don't even need to include any libraries: http://api.rubyonrails.com/classes/Object.html#M000022
nertzy
+1  A: 

Could you just put the string in a double-quote?

res = foo("<%= @ruby_var %>");
Toby Hede
but then what if @ruby_var has a double quote in it?
Yoni Baciu
A: 

I don't work with embedded Ruby too much. But how about using p (which invokes inspect) instead of <%= which might be doing something like print or puts. p always prints the string as if it were code wrapped in double quotes:

>> p "String ' \" String"
"String ' \" String"
# => nil  
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil
Joseph Pecoraro
+1  A: 

You can also use inspect assuming you know it'll be a single quote:

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