У меня есть эта строка в блоке javascript на странице:
res = foo('<%= @ruby_var %>');
Как лучше всего справиться со случаем, когда @ruby_var содержит одинарные кавычки? В противном случае это нарушит код JavaScript.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


@ruby_var.gsub(/[']/, '\\\'')
Это позволит избежать одиночной кавычки с апострофом, сохраняя ваш Javascript в безопасности!
Кроме того, если вы используете Rails, существует множество Инструменты для Javascript.
да, для работы с чемоданом Бентилли вам понадобится: @ruby_var.gsub(/['\\]/, '\\\\\0')
Я думаю, что я бы использовал библиотеку ruby JSON на @ruby_var, чтобы получить правильный синтаксис js для строки и избавиться от '', fex .:
res = foo(<%= @ruby_var.to_json %>)
(после require "json", не совсем уверен, как это сделать на странице, или верен ли приведенный выше синтаксис, поскольку я не использовал этот язык шаблонов)
(с другой стороны, если JSON когда-либо изменится, чтобы быть несовместимым с js, который сломается, но поскольку приличное количество кода использует eval () для eval json, я сомневаюсь, что это произойдет в ближайшее время)
Rails уже поставляется с String # to_json, поэтому вам даже не нужно включать какие-либо библиотеки: api.rubyonrails.com/classes/Object.html#M000022
.to_json добавляет html-кавычки (& quot;) к моей строке
Не могли бы вы просто заключить строку в двойные кавычки?
res = foo("<%= @ruby_var %>");
но что тогда, если в @ruby_var есть двойные кавычки?
Я не слишком много работаю со встроенным Ruby. Но как насчет использования p (который вызывает inspect) вместо <%=, который может делать что-то вроде print или puts. p всегда печатает строку, как если бы это был код, заключенный в двойные кавычки:
>> p "String ' \" String"
"String ' \" String"
# => nil
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil
Вы также можете использовать inspect, если знаете, что это будет одинарная цитата:
res = foo(<%= @ruby_var.inspect %>);
В Rails есть метод, специально предназначенный для этой задачи, который находится в ActionView :: Helpers :: JavaScriptHelper и называется escape_javascript.
В вашем примере вы должны использовать следующее:
res = foo('<%= escape_javascript @ruby_var %>');
Или еще лучше используйте ярлык j:
res = foo('<%= j @ruby_var %>');
Вы можете использовать следующее первое свойство, чтобы избавиться от символа "в вашей строке", а затем вы можете продолжить и использовать свою функцию json.
res = foo('<%= @ruby_var %>.first');
Что, если в коде уже есть \? Вам нужно сбежать \ прежде чем сбежать '.