给定由以下命令生成的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