我需要在 Rails 应用程序中进行一些复杂的路由:例如
match '/:ObjectName/:Method' => ???
所以根据对象的属性,我需要调用不同的控制器和动作。可能吗?
这里的最终目标是制作某种面向对象的操作,这样我就可以制作多个从彼此派生的控制器,这些控制器将添加/重写来自父控制器的操作。根据数据库中特定对象的属性,我会将其与这个或那个控制器相关联。
如果无法实现,routes.rb
我可以自己在控制器内部进行某种路由,所以我必须使用redirect_to
,但是如何指定原始请求传递的所有参数?
更新
这是另一个例子:
我有一个模型SpaceShipTypes
。它有一些字段,比如:type_name
, :weapon_type
, :shield_type
, :cargo_type
。有一个SpaceShipTypesController
with 之类的操作create
,update
这样我就可以使用某种 API 来管理类型。
还有另一种型号—— SpaceShips
. 它也有字段,例如:name
, :type_id
, :position
. 甚至还有一个SpaceShipsController
with 像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], ...