しばらくの間、この質問に対する答えを見つけようとしていましたが、新しい質問をする価値があると判断しました...
class Transport
次のように定義された、ポリモーフィックな複数のモデルがありますclass Transport::Car < Transport
。class Transport::Plane < Transport
baseTransportController
があり、すべてのタイプにTransport
対応するコントローラーがあります (すべてTransport
名前空間の下にあります)、Transport::CarController
つまりTransport::PlaneController
.
さまざまなアクションのルーティングを作成する方法を理解したいTransport
...
Transport
サブクラスがいくつあるかは先験的にわかりません(これは、データベース呼び出しを介して初期化子の一部として行われます)。- すべて
Transport
の には、 と を呼び出す 2 つの共有コントローラ アクションが#board
あり#depart
ます。これらのメソッドはTransportController
、Transport のタイプに関係なく、同じアクションを実行し、同じビューを表示するため、内部に存在する必要があります。 - 異なる
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"
これは「動的セグメント」で可能であるべきだと思いますが、うまく機能させることができません。助言がありますか?