Rails如何推断嵌套资源的父级?

时间:2013-10-31 15:53:25

标签: ruby-on-rails ruby ruby-on-rails-3 routes

我很想知道Rails如何自动推断嵌套资源的父级。我已经在RouteSet中完成了一些功课,但在所有的module_eval和动态生成的方法中,我还没弄清楚它是如何推断出父级的。

这就是我所说的具体

使用适当的模型和控制器假设常青的帖子和评论数据层次结构。

这些的嵌套路由看起来像这个

resources :posts do
  resources :comments
end

当我在控制器的上下文或评论的视图中时,rails可以像这样推断帖子:

post_comments_path

哪个会映射到当前帖子下的评论索引。

当我在帖子控制器和视图的上下文中时,我不再推断这条路线的帖子,要求我提供它。

post_comments_path # error
post_comments_path(@post) # ok

有人在other threads建议第二行是正确的方式。

我可能很疯狂,但我很想知道Rails如何推断帖子。我有一个边缘情况,在根控制器上有一个或两个动作,用于列出大多数嵌套东西的路径的菜单。我更愿意告诉 Rails当前父级用于这几个操作的内容,而不是在整个地方使用显式父引用来混淆我的视图代码。

更新

我确实尝试了设置post_id参数的基本功能。验证它确实设置在请求参数和参数上但没有成功。我对Rails制作params副本的模糊记忆很可能路由助手有一个单独的副本而没有我添加的参数? (设置@post实例变量也没有效果。我只需要检查。)

1 个答案:

答案 0 :(得分:1)

好的,这似乎与路径的defaults参数有关。

get '/posts/:post_id/comments', to: "comments#index", as: :show_default_comments, defaults:{post_id: Post.all.first.id}

这将根据第一篇文章向您显示评论index操作,因此我认为当您在评论控制器中时,默认值post_id将设置为{{1}的当前值}。我不得不做更多的测试来证实这一点。

(从我的评论中删除)找到它。 default_url_options Here。确认这样做确实有效,虽然它打破了我的索引视图,但这是我的目的似乎default_url_options在某个时候传入,这是推理发生的地方,你可以使用链接中的方法设置它。

在控制器中定义url_options方法以设置路径的default_url_options将允许您动态指定父路由以进行路由。