2

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

这就是我要说的具体

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

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

resources :posts do
  resources :comments
end

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

post_comments_path

这将映射到当前帖子下的评论索引。

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

post_comments_path # error
post_comments_path(@post) # ok

在其他线程中已建议第二行是正确的方法。

我可能疯了,但我很想知道 Rails 是如何推断 Post 的。我有一个极端情况,其中一个或两个操作在根控制器上,用于菜单列出大多数嵌套内容的路由。我更愿意告诉Rails 这几个动作的当前父级是什么,而不是在我的视图代码中到处都是显式的父级引用。

更新:

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

4

1 回答 1

1

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

IE。

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

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

(从我的评论中复制)找到了。default_url_options这里。确认这样做确实有效,尽管它破坏了我的索引视图,但就我而言,这似乎 default_url_options 在某些时候被传入,这是推理发生的地方,您可以使用链接中的方法进行设置。

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

于 2013-10-31T16:43:18.993 回答