0

我有一个故事模型和一个帖子模型。每个故事都有很多帖子。

在我的 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'

我相信我收到此错误是因为我没有设置 show.json.rabl 视图使用的 @story 实例变量。但我不确定如何解决这个问题并将 show.json.rabl 传递给正确的故事对象。

任何帮助将不胜感激!

4

1 回答 1

2

我使用了一个 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

这完全符合要求。

于 2013-03-06T19:27:44.700 回答