我有一个故事模型和一个帖子模型。每个故事都有很多帖子。
在我的故事#index action中我想使用rabl返回所有@stories,@ story中的每个故事也应该包含一个包含最近创建的帖子属性的子节点。
这是我最接近实现我正在寻找的东西:
#show.json.rabl
object @story
attributes :id, :title, :username
child @story.posts.first => :latest_post do
attributes :id, :story_id, :contents, :username
end
这在故事#show action中运作良好。但是,当我尝试用故事#index action
扩展它时#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传递给正确的故事对象。
非常感谢任何帮助!
答案 0 :(得分: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
这完全符合要求。