Javascript со встроенным Ruby: Как безопасно присвоить значение ruby переменной javascript

#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');