0

我需要在 Rails 应用程序中进行一些复杂的路由:例如

match '/:ObjectName/:Method' => ???

所以根据对象的属性,我需要调用不同的控制器和动作。可能吗?

这里的最终目标是制作某种面向对象的操作,这样我就可以制作多个从彼此派生的控制器,这些控制器将添加/重写来自父控制器的操作。根据数据库中特定对象的属性,我会将其与这个或那个控制器相关联。

如果无法实现,routes.rb我可以自己在控制器内部进行某种路由,所以我必须使用redirect_to,但是如何指定原始请求传递的所有参数?

更新

这是另一个例子:

我有一个模型SpaceShipTypes。它有一些字段,比如:type_name, :weapon_type, :shield_type, :cargo_type。有一个SpaceShipTypesControllerwith 之类的操作createupdate这样我就可以使用某种 API 来管理类型。

还有另一种型号—— SpaceShips. 它也有字段,例如:name, :type_id, :position. 甚至还有一个SpaceShipsControllerwith 像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], ...
4

1 回答 1

0

希望我能得到你想要达到的目标。

从您的评论中,我了解到您实际上只是希望增加/减少积分位置而不关心其类型。我不确定,但我认为您无法在不知道元素类型的情况下更新元素的属性,因为您如何从数据库中获取该对象?

但似乎您无论如何都在传递 url 中的对象类型(您的评论:)/point1/move

因此,您可以执行以下操作:

match => '/:object_type' => 'positionscontroller#move'

创建一个PositionsController具有:

def move
  if params[:object_type] == "point" # or whatever else you might have
   object = Points.find(params[:points_id])
  end

  if object.type == "blue"
    object.update_attr(:position, ...)
  else # object.type == "red"
    object.update_attr(:position, ...)
  end
end

请注意,这段代码并不漂亮,但我希望它无论如何都会有所帮助。

于 2012-12-19T13:53:33.470 回答