url_for依赖于当前路径?

时间:2015-04-10 15:11:37

标签: ruby-on-rails ruby routing

给定由以下命令生成的rails应用程序:

rails new pets
rails controller kitties index

我们将config/routes.rb更改为以下内容:

RoutingIssue::Application.routes.draw do
  match 'pets/:pet_id/kitties', controller: 'kitties', pet_id: /.+/, action: :index 
end

现在rails console我们得到以下内容:

2.1.1p76 :002 > ActionDispatch::Routing::RouteSet::Generator.new({pet_id: 2, controller: 'kitties', action: 'index'}, {controller: 'blubb'}, Rails.application.routes, false).generate
# => ["/pets/2/kitties", {}]

到目前为止一切顺利。解释:Generator的第一个参数是你想要获取url的控制器。第二个参数是映射到当前请求路径的控制器。意思是

url_for controller: 'kitties', pet_id: 2, action: 'index'

当走在' blubb'控制器导致控制台上显示的呼叫。

现在转到实际的问题

当在生成命名空间的控制器的请求路径上完成对url_for的相同调用时*会发生以下情况:

2.1.1p76 :003 > ActionDispatch::Routing::RouteSet::Generator.new({pet_id: 2, controller: 'kitties', action: 'index'}, {controller: 'blubb/blobb'}, Rails.application.routes, false).generate
# ActionController::RoutingError: No route matches {:pet_id=>2, :controller=>"blubb/kitties"}

为什么吗

无论当前的请求路径是什么,我都希望得到我的kitties控制器的正确URL(即' kitties'而不是' blubb / kitties')。而且我不明白为什么不是这样。我已经使用调试器逐步完成了我的应用程序,直到我在控制台上看到上面显示的代码(简化并独立制作)。

* config/route.rb中的内容如下所示:

namespace :blubb do
  resource :blobb, only: :index
end

0 个答案:

没有答案