web-dev-qa-db-ja.com

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

/notes.jsonなどのjson結果でインデックスを要求すると、メモが返されますが、ユーザーオブジェクトのuser_idのみが返されます。 user.usernameも含めたいと思います(そして、ユーザーオブジェクト全体を埋め込む方法に興味があります)。

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

27
Codezy

新しい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
43
Jimmy Cuadra

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
1
arthur bryant