2010-11-14 77 views
4

我最近加入了Rails應用程序開發(Rails3)的世界,我可能會濫用足夠的資源路由。Rails3:適當使用路由和資源

默認的資源路由爲我經常使用的URL提供了一些非常方便的幫助方法。我的問題是,我有控制器,我指定路由作爲足智多謀,只是爲了利用這些輔助方法。我有一些基本的網站導航,沒有資源業務。

resource :home do 
    member do 
    get 'main' 
    get 'about' 
    get 'login' 
    get 'help' 
    end 
end 

有沒有更好的方式來做我一直在做的事情?任何不需要我每次有新控制器操作時都手動添加路由條目的東西?

爲了澄清,我想爲控制器指定路由而不必顯式添加任何新操作,但我也希望它自動生成輔助方法。到目前爲止,我必須爲每個我想要的操作明確添加路由。我可以做這個(在非足智多謀的方式)類似,

match 'home/about' => 'home#about' 

但我不希望有寫非常不落入約定每路線。

+0

也許我誤解你,但它聽起來好像你希望它會自動通過您的控制器公衆期待方法,併爲它們創建命名路線。我讀的是對的嗎?如果是這樣,看來你正在尋求一種甚至Rails無法提供的魔法。 – 2010-11-14 16:31:32

+0

不,我想你說得對。舉個例子,像「match」這樣的一行:controller(/:action)'「會自動檢測控制器的動作並生成命名路由。我仍然在學習什麼樣的技巧軌道可用。另一方面,我不介意有人推薦一個更好的方法,或者給出一些他們通常爲他們的應用程序做這些事情的例子。 – 2010-11-14 16:45:15

回答

1

您可以查看公共實例方法的控制器並自動生成路由。

# routes.rb 
HomeController.public_instance_methods(false).select{|m| !(m.to_s =~ /^_/)}.each do |m| 
    match "home/#{m}", :action => m, :controller => HomeController, :as => "home_#{m}" 
end 

這將需要明確的(非繼承)公共實例從您的控制器方法,並選擇那些以下劃線(因爲下劃線的人產生了過濾器的方法,其餘是實際行動)。然後它會爲每個生成一條命名路線。

請注意,routes.rb僅在服務器啓動時處理,因此您必須在添加新操作後重新啓動服務器。

+0

這就是我現在正在研究的內容。不要進一步迫使你,但怎麼可能以更通用的方式完成,所以我可以傳遞任何控制器名稱?例如(假設它調用你定義的方法),generate_named_routes:home。我試圖弄清楚Rails中是否有代碼可以採用:home並將其變爲HomeController。那麼有一個生成命名路由的通用方法很簡單。 – 2010-11-14 17:00:02

+0

嘗試'「#{my_symbol.to_s.classify}控制器」。constantize'將符號轉換爲相應的控制器類。您可以將該類放入一個變量中,並使用它來代替直接指定控制器。 – edgerunner 2010-11-14 17:49:56

+0

感謝您的指導!我最終做了這件事,但爲了補充我的故事,我有一個可怕的疏忽。這依賴於控制器上存在的操作方法。在某些情況下,我有一個沒有爲其定義動作方法的視圖...我正在迴歸Rails的視圖自動映射。如果我想進一步採取這一行動,我必須做一些觀察,行動方法等的嗅探。可以蠕蟲。突然間,使用「匹配」主頁/關於''很容易。再次感謝! – 2010-11-14 21:55:18

2

這是另一個更簡單的。只需添加一個通用路由到您的routes.rb

match ":controller/:action" 

底部,它會直接映射到指定的控制器的指定動作。如果你喜歡,你可以更具體些。例如,使用的get代替match來限制對HTTP GET請求,指定applicaple控制器等

get ":controller/:action", :constraints => { :controller => /home|help/ }