2014-11-06 59 views
2

我想怎麼能寫的是一樣的東西:如何在不復制控制器名稱的情況下編寫Rails 4路由名稱空間?

namespace :cats do 
    get '/:breed/' => '#search_by_breed' 
    get '/:breed/count' => '#count_by_breed' 
    end 

但是,這導致這些航線有:

GET /cats/:breed(.:format)  cats/#search_by_breed 
    GET /cats/:breed/count(.:format) cats/#count_by_breed 

其中,由於在cats/#show斜線,將無法正常工作。

我知道我可以用下面這樣做:

get '/:breed/' => 'cats#search_by_breed' 
    get '/:breed/count' => 'cats#count_by_breed' 

導致這些路線:

GET /:breed(.:format)  cats#search_by_breed 
    GET /:breed/count(.:format) cats#count_by_breed 

然而,這種重複每次,命名cats控制器,我寧願不這樣做(在我的實際代碼中,我有更多的路線,而不僅僅是上面列出的兩個。不幸的是,我實際上並沒有在貓搜索網站上工作......)。我以爲會在這附近散步。

我錯過了什麼嗎?剛剛做完DRY誡命?這似乎是相當普遍的,但我沒有在routing docs中找到類似的東西。

回答

2

爲了回答您的主要問題,這是寫你的路由來完成你想要的東西的一種方式:

resources :cats, only: [], path: ":breed" do 
    collection do 
    get 'search_by_count', path: 'count' 
    get 'search_by_breed', path: '/' 
    end 
end 

,這將產生以下途徑:

search_by_count_cats GET /:breed/count(.:format) cats#search_by_count 
search_by_breed_cats GET /:breed(.:format)  cats#search_by_breed 

當然,你可以仍然使用單獨的聲明resources :cats來獲得更多的REST風格的索引,顯示等版本。

要回答你的第二個問題,「我是否overdoi幹誡命?「,這在很大程度上是一個主觀的問題。根據我的經驗,我看到很多情況下,我們以犧牲可讀性爲代價來幹太多,導致耦合增加。我個人覺得破譯以下需要較少的精神開銷:上採取明智的態度幹

get '/:breed/'  => 'cats#search_by_breed' 
get '/:breed/count' => 'cats#count_by_breed' 
get '/:breed/another' => 'cats#another_route' 

更多的想法,我給這篇文章http://www.infoq.com/news/2012/05/DRY-code-duplication-coupling和這次談話http://www.confreaks.com/videos/434-rubyconf2010-maintaining-balance-while-reducing-duplication

相關問題