Подтвердить что ты не робот

Rails escape_javascript создает недопустимый JSON, избегая одиночных кавычек

Метод escape_javascript в ActionView избегает апострофа ' как апостроф обратной косой черты \', который дает ошибки при анализе как JSON.

Например, сообщение "Я здесь" является действительным JSON при печати как:

{"message": "I'm here"}

Но, <%= escape_javascript("I'm here") %> выводит "I\'m here", что приводит к недействительности JSON:

{"message": "I\'m here"}

Есть ли исправление, чтобы исправить это, или альтернативный способ избежать строк при печати в JSON?

4b9b3361

Ответ 1

Просто вызовите .to_json в строке, и он будет экранирован правильно, например.

"foo'bar".to_json

Ответ 2

В результате я добавил новый метод escape_json к моему application_helper.rb на основе метода escape_javascript, найденного в ActionView::Helpers::JavaScriptHelper:

JSON_ESCAPE_MAP = {
    '\\'    => '\\\\',
    '</'    => '<\/',
    "\r\n"  => '\n',
    "\n"    => '\n',
    "\r"    => '\n',
    '"'     => '\\"' }

def escape_json(json)
  json.gsub(/(\\|<\/|\r\n|[\n\r"])/) { JSON_ESCAPE_MAP[$1] }
end

Кто-нибудь знает о лучшем обходном пути, чем это?

Ответ 3

У меня были некоторые проблемы, похожие на это, где мне нужно было поместить Javascript-команды в нижней части шаблона Rails, которые помещают строки в jQuery.data для последующего поиска и использования.

Всякий раз, когда у меня была одна кавычка в строке, я получал бы ошибку JavaScript при загрузке страницы.

Вот что я сделал:

-content_for :extra_javascript do
  :javascript
    $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}");

Ответ 4

Может потребоваться более подробная информация, но строки JSON должны использовать двойные кавычки. Одиночные кавычки подходят в строках JavaScript, но не в JSON.