2010-10-25 83 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