Ответ 1
Просто вызовите .to_json в строке, и он будет экранирован правильно, например.
"foo'bar".to_json
Метод escape_javascript в ActionView избегает апострофа '
как апостроф обратной косой черты \'
, который дает ошибки при анализе как JSON.
Например, сообщение "Я здесь" является действительным JSON при печати как:
{"message": "I'm here"}
Но, <%= escape_javascript("I'm here") %>
выводит "I\'m here"
, что приводит к недействительности JSON:
{"message": "I\'m here"}
Есть ли исправление, чтобы исправить это, или альтернативный способ избежать строк при печати в JSON?
Просто вызовите .to_json в строке, и он будет экранирован правильно, например.
"foo'bar".to_json
В результате я добавил новый метод 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
Кто-нибудь знает о лучшем обходном пути, чем это?
У меня были некоторые проблемы, похожие на это, где мне нужно было поместить Javascript-команды в нижней части шаблона Rails, которые помещают строки в jQuery.data
для последующего поиска и использования.
Всякий раз, когда у меня была одна кавычка в строке, я получал бы ошибку JavaScript при загрузке страницы.
Вот что я сделал:
-content_for :extra_javascript do
:javascript
$('#parent_#{parent.id}').data("jsonized_children", "#{escape_javascript(parent.jsonized_children)}");
Может потребоваться более подробная информация, но строки JSON должны использовать двойные кавычки. Одиночные кавычки подходят в строках JavaScript, но не в JSON.