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