2011-01-03 10 views
26

私はユーザに属するノートクラスを持っています(つまり、ユーザは多くのノートを作成できます)。私のノートコントローラRails:JSON出力の関連オブジェクトを含む

class NotesController < ApplicationController 
    before_filter :authenticate_user! 
    respond_to :html, :xml, :json 

    # GET /notes 
    # GET /notes.xml 
    def index 
    @notes = Note.includes(:user).order("created_at DESC") 
    respond_with @notes 
    end 

Iは、例えば、/notes.jsonのためのJSONの結果のインデックスを求めるから

クリップが、それはノートを返しますが、唯一のユーザーオブジェクトのuser_idを返します。私はuser.usernameも含めたいと思っています(そして、ユーザ全体のオブジェクトを埋め込む方法が不思議です)。

ボーナスに関する質問:列をauthor_idとして表示する方法を見つけられず、ユーザーに関連付けることができませんでした。これが簡単なのであれば、どうしますか?

答えて

39

新しいrespond_to/respond_withスタイルはこれを実行するのに十分な柔軟性がないのですか。非常にうまくいくかもしれませんが、私が理解する限り、最も簡単な場合のみを簡素化することを意図しています。

ブロックを使用して旧式のrespond_toで何をしようとしているかは、パラメータをto_jsonに渡すことで達成できます。

class NotesController < ApplicationController 
    def index 
    @notes = Note.order("created_at desc") 
    respond_to do |format| 
     format.json do 
     render :json => @notes.to_json(:include => { :user => { :only => :username } }) 
     end 
    end 
    end 
end 
+1

パーフェクト!それは私が行く必要があった場所に私を得た。あなたが示したようにjsonの部分を動作させた後、簡単にhtmlサポートを追加することができました。 – Codezy

+0

@Jimmy Cuadra:とても役に立ちました。本当にありがとう。 – Besi

-1

逆も可能でしょうか?

def index 
    @user = User.includes(:notes).order("created_at DESC") 
    respond_with @user 
end 

@notesを反復するたびにユーザーオブジェクトを含めることは費用がかかります。

+0

をすることができます。これは私の問題を解決するのではなく、すべてのユーザーを返します。 – Codezy

1

また、Jbuilder(https://github.com/rails/jbuilder)をデータに柔軟に対応させることもできます。

@notes = Note.includes(:user).order("created_at DESC") 

とあなたのindex.json.jbuilderファイルで、私はそれを作成したユーザー名を含むすべてのノートを取得しようとしています

json.extract! @note 
json.username @note.user.username 
関連する問題