Rails 3路由-从名称空间中指定确切的控制器

问题描述 投票:19回答:5

我以前从未遇到过的路由名称空间有一些问题。这实际上是我正在做的一些宝石开发的一部分-但我已经对该问题进行了重新设计,以适应更通用的导轨情况。

基本上,我有一个命名空间的路由,但我希望它定向到通用(顶层)控制器。

我的控制器是PublishController,它处理许多不同类型的模型的发布-它们都符合相同的接口,但是可以在不同的命名空间下。我的路线如下所示:

# config/routes.rb

namespace :manage do
  resources :projects do
    get 'publish' => 'publish#create'
    get 'unpublish' => 'publish#destroy'
  end
end

问题是,这会创建以下路由:

manage_project_publish GET    /manage/projects/:project_id/publish(.:format)        {:controller=>"manage/publish", :action=>"create"}
manage_project_unpublish GET    /manage/projects/:project_id/unpublish(.:format)      {:controller=>"manage/publish", :action=>"destroy"}

我想要的路由,只是没有映射到正确的控制器。我已经尝试了所有可以想到的方法,并尝试允许控制器不携带名称空间,但是我很困惑。

我知道我可以执行以下操作:

get 'manage/features/:feature_id/publish' => "publish#create", :as => "manage_project_publish"

产生:

manage_project_publish GET    /manage/projects/:project_id/publish(.:format)        {:controller=>"publish", :action=>"create"}

但理想情况下,我更愿意使用嵌套的声明(以提高可读性)-如果可能的话;我开始认为不是。

ruby-on-rails ruby-on-rails-3 routing
5个回答
12
投票

资源采用可选的哈希值,您可以在其中指定控制器,因此

resource :projects do

将写为

resource :projects, :controller=>:publish do 

5
投票

当您想要作用域路由而不是同名模块中的控制器时,请使用scope而不是namespace。>


3
投票

如果我了解您说的没错,您想要这样做:


3
投票

我认为您想要的是这:


0
投票

有点晚了,但是对于仍在努力解决这个问题的任何人,您都可以在控制器名称前添加一个斜杠,以将其从任何现有名称空间中拉出。

© www.soinside.com 2019 - 2024. All rights reserved.