Я рискну и скажу: «Нет, такого варианта нет».
AFAIK, кодирование JSON фактически обрабатывается ActiveSupport, а не ActiveRecord. Если вы посмотрите lib/active_support/json/encoding.rb
для своего гема ActiveSupport, вы увидите, как много обезьяньих патчей добавляются для добавления методов as_json
и encode_json
к некоторым базовым классам; as_json
методы просто используются для сглаживания таких вещей, как Time, Regexp и т. д., до более простых типов, таких как String. Интересны «обезьяны» патчи encode_json
, эти методы выполняют реальную работу по созданию JSON, и в них нет ничего для управления конечным форматом вывода; версия Hash, например, такова:
def encode_json(encoder)
"{#{map { |k,v| "#{encoder.encode(k.to_s)}:#{encoder.encode(v, false)}" } * ','}}"
end
encoder
просто обрабатывает такие вещи, как Unicode и экранирование кавычек. Как видите, encode_json
просто смешивает все это в одну компактную струну без каких-либо опций для включения красивости.
Кажется, что все сложные классы сводятся к Hash или Array во время JSONification, поэтому теоретически вы можете добавить свои собственные патчи обезьяны к Hash и Array, чтобы они производили что-то красивое. Однако у вас могут возникнуть проблемы с отслеживанием того, насколько глубоко в структуре вы создаете это:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
"nested":{
"not":"so pretty now",
"is":"it"
}
}
Было бы довольно просто, но это:
{
"created_at":"2011-07-10T11:30:49+03:00",
"id":5,
"is_deleted":null,
"name":"Mika"
"nested": {
"not":"so pretty now",
"is":"it"
}
}
будет сложнее, и, по-видимому, вы захотите последнее, особенно с глубоко вложенным JSON, где сложно взглянуть на структуру. Вы могли бы повесить немного состояния на encoder
, который передается, но это станет немного уродливым и хрупким.
Более подходящим вариантом был бы выходной фильтр для анализа и переформатирования JSON перед его отправкой в браузер. Вам придется одолжить или построить красивый принтер, но это не должно быть так сложно. Вы должны иметь возможность условно присоединить указанный фильтр только для своей среды разработки, не слишком уродливо.
Если вы просто хотите отладить свои взаимодействия на основе JSON, возможно, расширение JSONovich для Firefox было бы меньше хлопот. JSONovich имеет несколько приятных функций (таких как развертывание и свертывание вложенных структур), которые выходят за рамки простой красивой печати.
Кстати, я рассмотрел Rails 3.0 и 3.1 для этого, вы можете проверить Rails 2, если вам интересно.
10.07.2011