ruby-on-rails - Rails 如何推断嵌套资源的父级?

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

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

这就是我具体说的

假设具有适当模型和 Controller 的常绿帖子和评论数据层次结构。

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

resources :posts do
  resources :comments
end

当我处于 Controller 上下文或评论 View 中时,rails 能够像这样推断帖子:

post_comments_path

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

当我处于 posts Controller 和 View 的上下文中时,我的 rails 无法再推断出这条路线的帖子,需要我提供它。

post_comments_path # error
post_comments_path(@post) # ok

已在 other threads 中提出建议第二行是正确的方式。

我可能是疯了,但我很想知道 Rails 是如何推断 Post 的。我有一个边缘案例,其中一个或两个操作在根 Controller 上用于菜单列出大部分嵌套内容的路由。对于这几个操作,我更愿意告诉 Rails 当前的父级是什么,而不是到处用显式父级引用使我的 View 代码困惑。

更新:

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

最佳答案

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

即。

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

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

(从我的评论中复制)找到了。 default_url_options Here .确认这样做确实有效,尽管它破坏了我的索引 View ,但据我所知,default_url_options 似乎在某个时候被传入,这是推理发生的地方,您可以使用链接中的方法设置它。

在 Controller 中定义一个 url_options 方法来设置路径的 default_url_options 将允许您动态指定父级以用于路由目的。

关于ruby-on-rails - Rails 如何推断嵌套资源的父级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711147/

相关文章:

ruby - "require"默认查找的路径是什么?

ruby - 如何在 Rails 4.1 中只在路由上写入一次 path_names 并使其可用于所有路由?

ruby-on-rails - rake 数据库 :reset 'user does not have CONNECT privilege'

ruby-on-rails-3 - Rails 3.1,simple_form,使用 haml?

ruby-on-rails - 如何调试 Rails 错误中参数数量错误(1 代表 0)?

ruby-on-rails - 在 Ruby On Rails 中创建年份下拉框 FormBuilder

mysql - 为什么rails尝试连接mysql?

ruby-on-rails - Rails设计:after_confirmation

ruby-on-rails - 正确的 Rails 2.1 做事方式

javascript - Twitter Bootstrap 粘性子导航在它应该在较短的页面上之前变得固定