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?
5 ответов
Просто вызовите.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.
Уже есть проблема в 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")) %>