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

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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
7 831
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

@ruby_var.gsub(/[']/, '\\\'')

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

Кроме того, если вы используете Rails, существует множество Инструменты для Javascript.

Что, если в коде уже есть \? Вам нужно сбежать \ прежде чем сбежать '.

user11318 20.09.2008 04:26

да, для работы с чемоданом Бентилли вам понадобится: @ruby_var.gsub(/['\\]/, '\\\\\0')

rampion 20.09.2008 17:41
Ответ принят как подходящий

Я думаю, что я бы использовал библиотеку 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

Grant Hutchins 12.10.2008 01:54

.to_json добавляет html-кавычки (& quot;) к моей строке

akxer 06.06.2016 09:27

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

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

но что тогда, если в @ruby_var есть двойные кавычки?

Yoni Baciu 22.09.2008 19:40

Я не слишком много работаю со встроенным 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'); 

Другие вопросы по теме