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

5

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

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

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

Ваш Ответ

7   ответов
2
@ruby_var.gsub(/[']/, '\\\\\'')

сохраняя ваш Javascript в безопасности!

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

Что, если в коде уже есть \? Вам нужно сбежать, прежде чем вы убегаете ».
да, для того, чтобы разобраться с делом Бентиллы, вам нужно:@ruby_var.gsub(/['\\]/, '\\\\\0')
я думаю, что это правильно Yoni Baciu
0

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

>> p "String ' \" String"
"String ' \" String"
# => nil  
>> p 'alpha " \' alpha'
"alpha \" ' alpha"
# => nil  
8

ActionView :: Helpers :: JavaScriptHelper называетсяescape_javascript.

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

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

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

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

res = foo("<%= @ruby_var %>"); 
но что если @ruby_var содержит двойные кавычки? Yoni Baciu
2

если вы знаете, что это будет одинарная кавычка:

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

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

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

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

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

.to_json добавляет HTML-кавычки (& amp; quot;) в мою строку
Rails уже поставляется с String # to_json, поэтому вам даже не нужно включать какие-либо библиотеки:api.rubyonrails.com/classes/Object.html#M000022
0

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

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

Похожие вопросы