2010-10-25 47 views
1

我正在研究遊戲應用程序(移動前端,Rails後端)並試圖決定是否應該嚴格遵循RESTful。看來,如果我這樣做,我會創造更多的控制器。例如,我需要執行幾個遊戲動作,例如攻擊,防守等。如果我嚴格遵守RESTful,我需要爲每個遊戲動作創建一個控制器,只有一個REST動作(更新)。如果我去了非RESTul並創建了一個通用的戰鬥控制器,那麼我就可以爲攻擊,防守等創建方法/動作。似乎更加麻煩的是嚴格遵守RESTful。在Rails上嚴格遵守RESTful

任何見解將不勝感激。

+2

首先,您必須問自己,REST是否對您的應用程序有意義。你在談論「方法」和「行動」,而REST更多地是關於「資源」。資源類型的數量不取決於遊戲動作的數量 - 每個玩家可以有一個資源,在其中發佈其當前狀態(*例如*攻擊,防守,*等)。你能擴展更多關於你希望通過使用REST來完成的內容嗎?或者更多的是流行語?這是一個實時遊戲嗎? – user359996 2010-10-25 06:25:17

回答

8

攻擊,防守等都是同一種資源:Action

例如爲:

PUT actions/attack # to attack 
PUT actions/defend # to defend 
GET actions  # to get the list of all available actions 

要實現此爲REST,我會去是這樣的:

class PlayerActionsController ... 
    def index 
     @actions = PlayerAction.all 
     respond_with @actions 
    end 

    def update 
     @action = PlayerAction.find(params[:id])   
     respond_with @action.perform(params) 
    end 
end 


class GenericAction 
    attr_readable :name 

    def initialize(name) 
    @name = name 
    end 

    def perform(arguments) 
    self.send(name, arguments) if self.class.find(name) 
    end 

    ACTIONS = [] 
    ACTIONS_BY_NAME = {} 
    class << self 
    def add_action(*names) 
     names.each do |name| 
      action = Action.new(name) 
      ACTIONS_BY_NAME[name] = action 
      ACTIONS << action 
     end 
    end 

    def index 
     ACTIONS.dup 
    end  

    def find(name) 
     ACTIONS_BY_NAME[name] 
    end 
    end 
def 

class PlayerAction < GenericAction 
    add_action :attack, :defend 

    def attack(params) 
     player, target = Player.find(params[:player_id]), Player.find(params[:target_id]) 
     ... 
    end 


    def defend(params) 
     ... 
    end 
end 

這只是給它如何能夠做得好一個大概的瞭解。

+0

謝謝,這雖然在技術上有意義,但不需要通常的Rails REST操作,因爲沒有操作模型,它們是硬編碼的。但是,每個操作都會導致其他模型的更改。基本上我會創建一個動作控制器,如果我想要轉到RESTful,請創建自定義REST動作。然而,看起來我不應該在這種情況下使用REST,並簡單地爲所有不同的操作,想法創建一個控制器? – Bob 2010-10-26 17:49:41

+0

我已經更新了我的答案。以這種方式存儲它們會使操作安全性等級變得微不足道,以實現其他功能:) – glebm 2010-10-27 03:31:11

+0

謝謝,這是一個有創意的解決方案,但實現自定義REST操作似乎更簡單。 – Bob 2010-10-28 17:08:24