Rails escape_javascript создает недопустимый JSON, экранируя одинарные кавычки - PullRequest
18 голосов
/ 26 апреля 2010

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

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

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

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

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

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

Ответы [ 5 ]

10 голосов
/ 29 июля 2010

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

"foo'bar".to_json
8 голосов
/ 27 апреля 2010

Я закончил тем, что добавил в свой application_helper.rb новый метод escape_json, основанный на методе 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

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

5 голосов
/ 08 ноября 2011

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

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

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

-content_for :extra_javascript do
  :javascript
    $('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}");
4 голосов
/ 26 апреля 2010

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

0 голосов
/ 31 октября 2018

Уже есть проблема в github / rails https://github.com/rails/rails/issues/8844

Исправлено, чтобы пометить строку как html_safe

<%= escape_javascript("I'm here".html_safe) %>

или даже лучше, вы можете дезинфицировать строку

<%= sanitize(escape_javascript("I'm here")) %>
<%= escape_javascript(sanitize("I'm here")) %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...