Javascript со встроенным Ruby: как безопасно назначить значение ruby ​​переменной javascript - PullRequest
5 голосов
/ 20 сентября 2008

У меня есть эта строка в блоке JavaScript на странице:

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

Как лучше всего справиться со случаем, когда @ruby_var содержит одинарную кавычку? Иначе это нарушит код JavaScript.

Ответы [ 7 ]

11 голосов
/ 20 сентября 2008

Думаю, я бы использовал библиотеку ruby ​​ JSON в @ruby_var, чтобы получить правильный синтаксис js для строки и избавиться от '', fex.:

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

(после запроса "json", я не совсем уверен, как это сделать на странице или правильный синтаксис приведен выше, поскольку я не использовал этот язык шаблонов)

(с другой стороны, если JSON когда-либо изменился, чтобы быть несовместимым с js, который сломался бы, но, так как приличный объем кода использует eval () для оценки json, я сомневаюсь, что это произойдет в ближайшее время)

8 голосов
/ 14 февраля 2012

В Rails есть метод, специально предназначенный для этой задачи, который можно найти в ActionView :: Helpers :: JavaScriptHelper с именем escape_javascript .

В вашем примере вы бы использовали следующее:

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

Или еще лучше, используйте ярлык j :

res = foo('<%= j @ruby_var %>');
2 голосов
/ 10 октября 2008

Вы также можете использовать inspect, предполагая, что это будет одинарная кавычка:

res = foo(<%= @ruby_var.inspect %>);
2 голосов
/ 20 сентября 2008

Не могли бы вы просто поместить строку в двойные кавычки?

res = foo("<%= @ruby_var %>"); 
2 голосов
/ 20 сентября 2008
@ruby_var.gsub(/[']/, '\\\\\'')

Это позволит избежать одиночной кавычки с апострофом, сохраняя ваш Javascript в безопасности!

Кроме того, если вы в Rails, есть куча специфичных для Javascript инструментов .

0 голосов
/ 14 декабря 2016

Вы можете использовать следующее первое свойство, чтобы избавиться от "из вашей строки, а затем вы можете продолжить и использовать функцию json.

res = foo('<%= @ruby_var %>.first'); 
0 голосов
/ 20 сентября 2008

Я не слишком много работаю со встроенным Ruby. Но как насчет использования p (который вызывает inspect) вместо <%=, который может делать что-то вроде print или puts. p всегда печатает строку, как если бы это был код, заключенный в двойные кавычки:

>> p "String ' \" String"
"String ' \" String"
# => nil  
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...