

jbuilderでjsonのテンプレの作り方で悩んでいます。

Userと関連づけしたPostの情報をjsonで出すためにはどのようにjsonのテンプレートを書けばいいでしょうか。

理想として  
GET ~/api/v1/users/allで

id  
user_name  
user_account  
user_img  
user.post.id  
user.post.post_image

をjsonで出力したいと思っています。

よろしくお願いします。

# DB

[code]

    User
    id:integer
    provider:string
    user_name:string
    user_account:
    user_img:
    has_many :posts    
    
    Post
    id: integer
    user_id: integer
    post_image: string
    text: string
    belongs_to :user
    
[/code]

# api.rb

[code]

    module Cospic
     class API < Grape::API
    format :json 
    formatter :json, Grape::Formatter::Jbuilder
       # APIアクセスに接頭辞を付加
       # ex) http://localhost:3000/api
       prefix "api"
    
       # APIアクセスにバージョン情報を付加
       # ex) http://localhost:3000/api/v1
       version 'v1', :using => :path
    
       resource "users" do
        # GET http://localhost:3000/api/v1/users/all
         desc "ユーザー一覧"
          get :all, jbuilder:'users' do
           @users = User.all
          end
    
[/code]

# app/view/api/user.jbuilder

[code]

    json.articles @users do |user|
      json.(user, id, :user_name, :user_account, :user_img, :user.post.id, :user.post.post_image )
    end
    
[/code]


CC BY-SA 3.0
2015-01-12T09:45:33.377
4430
2015-01-15T11:13:40.057
2015-01-12T10:59:58.413
3068
5891
question
ruby-on-rails json grape
[Rails+grape]jbuilderで関連づけしたテーブルの情報をAPIでjson形式で出力する方法


記載方法はいろいろありますが、解りやすい次のように記載したら良いと思います。

[code]

    # xxx.json.jbuilder
    json.user_name    @user.user_name
    json.user_account @user.user_account
    json.user_img     @user.user_img
    
    json.posts @user.posts.each do |post|
       json.post_id    post.id
       json.post_image post.post_image
    end
    
[/code]

jbuilderの簡単な使い方ですが、json.xxxのxxxの部分がJSONのキーになり、その引数がJSONのバリューになります。  
階層構造にしたい場合は、json.posts @user.posts.eachのように記載すればよいです。

[code]

    # 出力されるJSON
    { 
      "user_name"    => "user_name"
      "user_account" => "user_account",
      "user_img"     => "user_img",
      "posts" => [
        { "post_id" => 1 }, { "post_image" => "post_image" },
        { "post_id" => 1 }, { "post_image" => "post_image" }
      ]
    }
    
[/code]


CC BY-SA 3.0
2015-01-15T11:13:40.057
4612
2015-01-15T11:13:40.057
7417
4430
answer