0

Rails アプリケーションで複雑なルーティングを行う必要があります。たとえば、次のようなものです。

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

そのため、オブジェクトのプロパティに応じて、別のコントローラーとアクションを呼び出す必要があります。出来ますか?

ここでの最終的な目標は、ある種のオブジェクト指向アクションを作成することです。これにより、親コントローラーからアクションを追加/書き換える、相互に派生した複数のコントローラーを作成できるようになります。DB 内の特定のオブジェクトのプロパティに応じて、これまたはそのコントローラーに関連付けます。

達成できない場合はroutes.rb、コントローラー内で何らかのルーティングを自分で作成できるため、を使用redirect_toする必要がありますが、元のリクエストで渡されたすべてのパラメーターを指定するにはどうすればよいですか?

アップデート

別の例を次に示します。

私はモデルを持っていますSpaceShipTypes。、、、などのいくつかのフィールドが:type_nameあります。のような with アクションがあるので、ある種の API を使用して型を管理できます。:weapon_type:shield_type:cargo_typeSpaceShipTypesControllercreateupdate

別のモデルもあります - SpaceShips:name:type_id、などのフィールドもあります:position。、、SpaceShipsControllerのようなアクションを持つものさえあります。createdestroymove

ここに問題があります -いくつかのタイプの宇宙船では、標準のコントローラ アクションの動作を変更したり、追加のアクションを記述したりしたいと考えています。そのため、電話をかけるときは、特定の宇宙船/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 に答える