尽管定义资源和模型关系的语法相似,但您不应该误以为资源映射到模型。读什么大卫·布莱克不得不说.
您遇到的问题是您生成的路线。使用嵌套语法,如下所示:
map.resources :users do |user|
user.resources :posts
user.resources :comments
user.resources :comments_received
end
然后运行'rake routes'
,给了我(还有很多其他东西!):
users GET /users {:action=>"index", :controller=>"users"}
user_posts GET /users/:user_id/posts {:action=>"index", :controller=>"posts"}
user_comments GET /users/:user_id/comments {:action=>"index", :controller=>"comments"}
user_comments_received_index GET /users/:user_id/comments_received {:action=>"index", :controller=>"comments_received"}
所以看来 Rails 正在将 _index 添加到 comments_received 路由的末尾。我承认我不知道为什么(与其他评论路线冲突有关?),但它解释了你的问题。
更好的选择可能是在评论资源上定义收集操作,如下所示:
map.resources :users do |user|
user.resources :posts
user.resources :comments, :collection => {:received => :get}
end
这将为您提供以下路线:
users GET /users {:action=>"index", :controller=>"users"}
user_posts GET /users/:user_id/posts {:action=>"index", :controller=>"posts"}
user_comments GET /users/:user_id/comments {:action=>"index", :controller=>"comments"}
received_user_comments GET /users/:user_id/comments/received {:action=>"received", :controller=>"comments"}
注意:收到的操作现在位于评论控制器上