Rails アプリケーションで複雑なルーティングを行う必要があります。たとえば、次のようなものです。
match '/:ObjectName/:Method' => ???
そのため、オブジェクトのプロパティに応じて、別のコントローラーとアクションを呼び出す必要があります。出来ますか?
ここでの最終的な目標は、ある種のオブジェクト指向アクションを作成することです。これにより、親コントローラーからアクションを追加/書き換える、相互に派生した複数のコントローラーを作成できるようになります。DB 内の特定のオブジェクトのプロパティに応じて、これまたはそのコントローラーに関連付けます。
達成できない場合はroutes.rb
、コントローラー内で何らかのルーティングを自分で作成できるため、を使用redirect_to
する必要がありますが、元のリクエストで渡されたすべてのパラメーターを指定するにはどうすればよいですか?
アップデート
別の例を次に示します。
私はモデルを持っていますSpaceShipTypes
。、、、などのいくつかのフィールドが:type_name
あります。のような with アクションがあるので、ある種の API を使用して型を管理できます。:weapon_type
:shield_type
:cargo_type
SpaceShipTypesController
create
update
別のモデルもあります - SpaceShips
。:name
、:type_id
、などのフィールドもあります:position
。、、SpaceShipsController
のようなアクションを持つものさえあります。create
destroy
move
ここに問題があります -いくつかのタイプの宇宙船では、標準のコントローラ アクションの動作を変更したり、追加のアクションを記述したりしたいと考えています。そのため、電話をかけるときは、特定の宇宙船/ship1/move
を動的にチェックして適切なアクションを取得する必要があります。:type_id
だから私は、派生コントローラーを次のようにするといいと思いました
class BattleStationsController < SpaceShipController
def move
# does nothing
end
end
class DeathStarsController < SpaceShipsController
def overkill
SpaceShip.find(params[:target_id]).destroy
end
end
...
routes.rb の助けを借りてこれをうまくできたらいいのにと思いますが、手がかりがありません...したがって、追加のルーティングを処理するために特別なコントローラーを作成する必要があるかもしれません。
class RoutingsController < ApplicationController
def route
ship = SpaceShip.find(params[:name])
case (ship.type_id)
when 'battlestation' then redirect_to :controller => 'battlestations', ...
when 'deathstar' then redirect_to :controller => 'deathstars', ...
...
end
end
end
しかし、最初に渡されたすべてのパラメータをリダイレクトする方法がわからないので、大量に書く必要はありません
redirect_to :controller => '...', :action => '...', :param1 => params[:param1], param2 => params[:param2], ...