在Rails 3.2.8中使用jbuilder模板生成的Pretty Print JSON

idS*_*tar 5 json pretty-print jbuilder ruby-on-rails-3

任何人都有办法从jbuilder打印JSON输出?

我可以在控制器动作中生成相当类似的东西:

JSON.pretty_generate(some_json_object) 
Run Code Online (Sandbox Code Playgroud)

但是一旦我传递给jbuilder模板,我就不知道有什么方法可以将输出打印出来.

现在,我的action方法的render语句很简单:

render formats: :json    
Run Code Online (Sandbox Code Playgroud)

无论指定的输入格式类型(这是我想要的行为),这都成功地强制使用jbuilder进行渲染.

idS*_*tar 6

我找到了一种方法:

 json_string = render_to_string formats: :json    
 json_object = JSON.parse(json_string)     
 render :json => JSON.pretty_generate(json_object)     
Run Code Online (Sandbox Code Playgroud)

同样,这假设有一个jbuilder模板用于此操作,它将创建初始json,它将呈现为字符串,返回到json对象,然后传递给pretty_generate().

这有点迂回,但它确实有效.我当然完全接受更严格的实施!


Mar*_*phy 5

# 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
Run Code Online (Sandbox Code Playgroud)
# 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 )
Run Code Online (Sandbox Code Playgroud)

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


wes*_*ter -1

我觉得这个比较简单

@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"}]}
Run Code Online (Sandbox Code Playgroud)

或者,更快的单行,

PP.pp JSON.parse Blog.first.to_json
Run Code Online (Sandbox Code Playgroud)