2

一直在試圖找到一個回答這個問題了一會兒,決定這是值得一問的一個新...軌道3多態性路由

我有多個型號,其是多態的,等被定義:class Transportclass Transport::Car < Transportclass Transport::Plane < Transport

我有一個基地TransportController,然後每一種類型的Transport具有相應的控制器(下的所有Transport命名空間),即Transport::CarControllerTransport::PlaneController

我想弄清楚如何爲不同Transport行動創建路由...

  • 我不知道先驗我多少Transport子類將有(這是作爲一個部分進行初始化器通過數據庫調用)。
  • 對於每個Transport,有兩個共享的控制器操作,稱它們爲#board#depart。這些方法應該位於TransportController之內,因爲它們執行相同的操作並顯示相同的視圖,而不考慮傳輸類型。
  • 不同的Transport類型可以有自己的動作不同的實現。例如#choose_seat對於一輛汽車和一架飛機都有不同的約束和不同的意見,但動作是一樣的。
  • 不同Transport類型有權採取獨特的行動。例如Transport::PlaneController應該有一個#landing_gear_up動作,而這對Transport::CarController沒有意義。

我可能喜歡像一個路由文件:

# for an action landing_gear_up only inside plane 
match '/transport/plane/landing_gear_up', 
     :controller => "Transport::PlaneController", 
     :action => "landing_gear_up" 

# for an action on every transport type that are handled differently 
match '/transport/:type/choose_seat', 
     :controller => "Transport::<type>Controller", 
     :action => "choose_seat" 

# for the actions that are handled commonly across every type of transport 
match '/transport/:type/board', :to => "transport#board" 
match '/transport/:type/depart', :to => "transport#depart" 

我覺得這應該是可能的「動態段」,但我不能設法得到它才能正常工作。有什麼建議麼?

回答

1

您可以在routes.rb中定義方法和變量,使代碼更加乾爽。我將如何嘗試去做的一個例子:

Your::Application.routes.draw do 
    ## other routes 

    ## helper method to define transport route 
    def route_transport action, types 
    match "/transport/:type/#{action}", :to => "transport##{action}" and return if types == :common 
    [types].flatten.each { |t| match "/transport/#{t}/#{action}", :controller => "Transport::#{t}Controller", :action => action } 
    end 

    { 
    :board => :common, 
    :depart => :common, 
    :landing_gear_up => :plane, 
    :choose_seat => [:car, :plane], 
    # action name => :common or transport type(s) 
    }.each { |action, types| route_transport action, types } 

    ## other routes 
end 

我沒有檢查代碼,它可能包含錯誤。運行rake routes檢查是否正在生成正確的路由。

另外,看看RESTful routes - 從長遠來看,它們可能會讓您的生活更輕鬆。

0

如果您在控制器中具有相同的繼承層次結構,那麼您不必做任何特殊的事情。只需聲明資源,爲每個Controller聲明非RESTful路由,就完成了。 PlaneController#板將自動調用TransportController#板。特定於PlaneController的操作將保持特定於該控制器。