Pretty Print JSON, сгенерированный с помощью шаблона jbuilder в Rails 3.2.8

У кого-нибудь есть способ красиво распечатать вывод JSON из jbuilder?

Я могу распечатать JSON, сгенерированный в действии контроллера, примерно так:

JSON.pretty_generate(some_json_object) 

но как только я перейду к шаблону jbuilder, я не знаю, как правильно распечатать этот вывод.

Прямо сейчас оператор рендеринга моего метода действия прост:

render formats: :json    

И это успешно вызывает рендеринг с помощью jbuilder, независимо от указанного типа входного формата (что является моим желаемым поведением).


person idStar    schedule 29.10.2012    source источник


Ответы (5)


Я думаю, что это проще,

@package = Package.first

json = JSON.parse(@blog.to_json)

PP.pp(json)

{"id_to_s"=>"5222675dbc11149e3a000002",
 "title"=>"Package Title",
 "version"=>"0.1.1",
 "comment"=>
  {"user"=>"Joe",
   "description"=>"Joe's comment"},
 "assets"=>
  [{"id_to_s"=>"522a4620fa451436f4000001",
    "_type"=>"Illustration",
    "start"=>0,
    "stop"=>100,
    "caption"=>"mountain climbing"},
   {"id_to_s"=>"522a56a6fa4514523a000001",
    "_type"=>"Illustration",
    "start"=>200,
    "stop"=>300,
    "caption"=>"airport"},
   {"id_to_s"=>"522a6a0ffa4514a30e000002",
    "_type"=>"Illustration",
    "start"=>400,
    "stop"=>600,
    "caption"=>"doc"},
   {"id_to_s"=>"522aa46bbc1114551f000001",
    "_type"=>"Illustration",
    "start"=>nil,
    "stop"=>nil,
    "caption"=>nil},
   {"id_to_s"=>"522aa47fbc1114551f000002",
    "_type"=>"Illustration",
    "start"=>10,
    "stop"=>30,
    "caption"=>"asdflkjsd"}]}

Или, более быстрый однострочник,

PP.pp JSON.parse Blog.first.to_json
person westonplatter    schedule 07.09.2013
comment
Согласен, это намного чище, чем обходной путь, который я использовал изначально. - person idStar; 07.09.2013
comment
Да, и, вероятно, есть девять других способов выполнить ту же задачу. - person westonplatter; 08.09.2013
comment
Классно, чувак. Я знаю, что этот комментарий не информативен, как того хочет сообщество. Тем не менее, я очень хочу узнать о каких-либо ссылках, по которым я могу сделать некоторую магию быстрого доступа на терминале, связанном с рельсами? - person RajG; 20.12.2013
comment
Это не похоже на то, что это на самом деле отвечает на вопрос. Это красиво печатает Ruby Hash, который не является допустимым JSON. Если цель состоит в том, чтобы вернуть красиво напечатанный JSON из действия контроллера, это не сработает. - person Dathan; 08.03.2017

Я нашел способ сделать это:

 json_string = render_to_string formats: :json    
 json_object = JSON.parse(json_string)     
 render :json => JSON.pretty_generate(json_object)     

Опять же, это предполагает, что для этого действия существует шаблон jbuilder, который создаст исходный json, который преобразуется в строку, обратно в объект json, а затем передается в pretty_generate().

Это немного запутанно, но это работает. Я, конечно, полностью открыт для более жестких реализаций!

person idStar    schedule 29.10.2012

# config/initializers/jbuilder_prettify.rb
require "jbuilder"

class Jbuilder
  ##
  # Allows you to set @prettify manually in your .jbuilder files. 
  # Example: 
  #   json.prettify true
  #   json.prettify false 
  #  
  attr_accessor :prettify

  alias_method :_original_target, :target!

  ##
  # A shortcut to enabling prettify.
  # Example:
  #   json.prettify!
  #
  def prettify!
    @prettify = true
  end

  def target!
    @prettify ? ::JSON.pretty_generate(@attributes) : _original_target
  end
end

# app/views/api/v1/users/show.json.jbuilder
json.prettify! if %w(1 yes true).include?(params["pretty"])

json.( @user, :id, :name, :created_at, :updated_at )

https://github.com/rails/jbuilder/issues/195#issuecomment-44440569

person Mark Murphy    schedule 28.05.2014

Расширение ответа Блейка Миллера...

Вот код из gist:

require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
  MultiJson.dump_options = {:pretty=>true}
end

Я поместил это в файл с именем /config/initializers/jbuilder_prettify.rb.

Чтобы это работало, вы должны иметь гем yajl-ruby, включенный в ваш Gemfile. Обратите внимание, что на домашней странице jbuilder github здесь упоминается, как использование чего-то вроде yajl-ruby ускорит до вашего рендеринга json.

person DavB    schedule 10.04.2015

Это сработало для меня, а принятый ответ - нет. Это также короче!

https://gist.github.com/jmoe/02c7476adac24eddd969

require 'multi_json'
MultiJson.use :yajl
unless Rails.env.production?
  MultiJson.dump_options = {:pretty=>true}
end
person Blake Miller    schedule 13.11.2014