2012-12-19 122 views
0

我需要在rails應用中做一些複雜的路由:例如像Rails複雜路由

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

因此,根據對象的屬性我需要調用不同的控制器和操作。可能嗎?

這裏的最終目標是做出某種面向對象的動作,這樣我就可以製作多個從另一個派生的控制器,這些控制器會從父控制器添加/重寫動作。根據數據庫中特定對象的屬性,我會將其與該控制器或該控制器相關聯。

如果這是不可能實現與routes.rb我可以做出某種路由自己的控制器內的,所以我將不得不使用redirect_to,但我怎麼可以指定有與原來的請求獲得通過,所有PARAMS?

UPDATE

下面是另一個例子:

我有一個模型SpaceShipTypes。它有一些字段,如:type_name,:weapon_type,:shield_type,:cargo_type。有一個SpaceShipTypesController與動作像create,update,以便我可以使用某種類型的API管理類型。

還有另一種模式 - 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 

但我不知道如何重定向所有最初通過PARAMS,這樣我就不必寫一噸的

redirect_to :controller => '...', :action => '...', :param1 => params[:param1], param2 => params[:param2], ... 
+2

面向對象的動作?我相信你正在用自己的方式來複制已經爲你做的事。看看:http://guides.rubyonrails.org/routing.html – wpp

+0

@sytycs,我看過那裏,但仍然沒有線索。我們舉一個例子: 我有一個名爲Points的模型,其中包含三個字段:名稱(字符串),類型(字符串)和位置(整數)。還有兩個動作:改變類型和移動。 現在,如果鍵入=「藍色」,移動將加1到位置,如果類型=「紅色」,它將減去1. 我想實現的是 - 當我調用/ point1/move時,我得到正確的位置改變point1,無論類型如何,我都沒有在URL中指定類型,類型可能會隨着時間而改變。 真正的邏輯當然要複雜得多,我可能需要爲不同的對象渲染不同的視圖等 – xaxa

回答

0

希望我得到你想達到的。

從你的評論我明白你實際上只是想增加/減少一個點的位置而不關心它的類型。我不確定,但我認爲你不能不知道它的類型更新元素的屬性,因爲你怎麼能從數據庫中獲得該對象?

但好像你傳遞的對象反正在網址欄中輸入(您的評論:/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 

注意這段代碼並不漂亮,但我希望它有幫助。

+0

嗨,這不完全是我想要的,請參閱更新到原始帖子。 – xaxa