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

the*_*RON 19 routing ruby-on-rails ruby-on-rails-3

我之前遇到的路由命名空间有点问题.这实际上是我正在做的一些宝石开发的一部分 - 但我已经重新设计了这个问题以适应更通用的rails情况.

基本上,我有一个命名空间路由,但我希望它指向一个通用(顶级)控制器.

我的控制器是PublishController,处理许多不同类型的模型的发布 - 它们都符合相同的接口,但可以在不同的名称空间下.我的路线看起来像这样:

# config/routes.rb

namespace :manage do
  resources :projects do
    get 'publish' => 'publish#create'
    get 'unpublish' => 'publish#destroy'
  end
end
Run Code Online (Sandbox Code Playgroud)

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

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"}
Run Code Online (Sandbox Code Playgroud)

哪个是我想要的路线,只是没有映射到正确的控制器.我已经尝试了所有我能想到的尝试并允许控制器不要携带命名空间,但我很难过.

我知道我可以做以下事情:

get 'manage/features/:feature_id/publish' => "publish#create", :as => "manage_project_publish"
Run Code Online (Sandbox Code Playgroud)

产生:

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

但理想情况下,我更喜欢使用嵌套声明(为了便于阅读) - 如果它甚至可能; 我开始认为它不是.

mas*_*omi 12

resource采用可选的哈希值,您可以在其中指定控制器

resource :projects do
Run Code Online (Sandbox Code Playgroud)

将写成

resource :projects, :controller=>:publish do 
Run Code Online (Sandbox Code Playgroud)


Rya*_*igg 5

使用scope而不是namespace当您想要一个范围的路由而不是同一个模块中的控制器时.