2011-01-03 3 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 

Когда я прошу индекс в результатах JSon для примера /notes.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

Отлично! Это привело меня туда, куда мне нужно было идти. Был в состоянии добавить обратно в html поддержку легко после того, как Json part работал, как вы показали. – 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 
Смежные вопросы