Возврат только первого потомка в дочернем узле

У меня есть модель истории и модель поста. В каждой истории много постов.

В моем действии story#index я хотел бы использовать rabl для возврата всех @stories, и каждая история в @stories должна также включать дочерний узел, содержащий атрибуты из последней созданной записи.

Вот самое близкое, что я пришел к достижению того, что я ищу:

#show.json.rabl

object @story

attributes  :id, :title, :username

child @story.posts.first => :latest_post do
  attributes  :id, :story_id, :contents, :username
end

Это отлично работает в действии stories#show. Но когда я пытаюсь расширить его с помощью действия stories#index

#index.json.rabl

collection @stories

extends "stories/show"

Я получаю следующую ошибку:

ActionView::Template::Error (undefined method `posts' for nil:NilClass):
    1: collection @stories
    2: 
    3: extends "stories/show"
  app/views/stories/show.json.rabl:8:in `render'

Я считаю, что получаю эту ошибку, потому что я не устанавливаю переменную экземпляра @story, используемую представлением show.json.rabl. Но я не уверен, как обойти это и передать show.json.rabl правильный объект истории.

Любая помощь будет принята с благодарностью!


person chuck w    schedule 06.03.2013    source источник


Ответы (1)


Я использовал партиал rabl для решения проблемы. Вот как:

#story.show.json.rabl

object @story

attributes  :id, :title, :username

node :latest_post do |story|
  { :post => partial("posts/show", :object => story.posts.first)}
end

#story.index.json.rabl

collection @stories

extends "stories/show"

post.show.json.rabl

object @post

attributes  :id, :story_id, :contents, :username

Это работает именно так, как требуется.

person chuck w    schedule 06.03.2013