2011-04-11 79 views
19

我遇到了一些我以前沒有遇到過的路由名稱空間問題。這實際上是我正在做的一些寶石開發的一部分 - 但我已經重新解決了這個問題,以適應更通用的導軌情況。Rails 3路由 - 從命名空間內指定確切的控制器

基本上,我有一個名稱空間路由,但我希望它直接指向一個通用(頂級)控制器。

我的控制器是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"} 

,但理想情況下,我寧願使用嵌套的聲明(爲便於閱讀) - 如果甚至有可能;我開始認爲它不是。

回答

5

使用scope而不是namespace當你想要一個作用域路由而不是同名模塊中的控制器。

+0

我原本以爲要做到這一點並創建命名路由太 - 但不幸的是,因爲這實際上是作爲一個gem的一部分打包成一個路由幫助器方法,所以我無法控制這個包裝方法。因此,我爲什麼要尋找一種方式來「爆發」當前的命名空間。 – theTRON 2011-04-18 05:49:55

+0

並且作用域不會創建命名路線AFAIK – Geoffroy 2014-02-13 20:23:35

+1

您可以在作用域末尾使用'as :: blah'來完成此操作。 – 2014-02-21 09:18:00

12

資源有一個可選的哈希值,你可以指定控制器,所以如果我理解你正確

resource :projects do 

將寫作

resource :projects, :controller=>:publish do 
3

,你想這樣:

scope :manage do 
    resources :projects, :only => [] do 
    get 'publish' => 'publish#create' 
    get 'unpublish' => 'publish#destroy' 
    end 
end 

來製作這些路線:

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

我是否正確理解您的需求?如果是這樣,Ryan正在解釋這一點。

+0

你是對的,對於這種情況,'範圍'是完美的,你希望URL的範圍是,但控制器不在URL中。 – 2011-12-15 03:28:47

+0

感謝威廉,我本可以發誓當時我嘗試過 - 但我必須挖掘項目並看看。 – theTRON 2011-12-15 05:08:16

1

我想你想要的是這樣的:

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

這如你所願(manage_projects ...),但還是把控制器::Publish

相關問題