我正在研究游戏应用程序(移动前端,Rails后端)并试图决定是否应该严格遵循RESTful。看来,如果我这样做,我会创造更多的控制器。例如,我需要执行几个游戏动作,例如攻击,防守等。如果我严格遵守RESTful,我需要为每个游戏动作创建一个控制器,只有一个REST动作(更新)。如果我去了非RESTul并创建了一个通用的战斗控制器,那么我就可以为攻击,防守等创建方法/动作。似乎更加麻烦的是严格遵守RESTful。在Rails上严格遵守RESTful
任何见解将不胜感激。
我正在研究游戏应用程序(移动前端,Rails后端)并试图决定是否应该严格遵循RESTful。看来,如果我这样做,我会创造更多的控制器。例如,我需要执行几个游戏动作,例如攻击,防守等。如果我严格遵守RESTful,我需要为每个游戏动作创建一个控制器,只有一个REST动作(更新)。如果我去了非RESTul并创建了一个通用的战斗控制器,那么我就可以为攻击,防守等创建方法/动作。似乎更加麻烦的是严格遵守RESTful。在Rails上严格遵守RESTful
任何见解将不胜感激。
攻击,防守等都是同一种资源: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
这只是给它如何能够做得好一个大概的了解。
谢谢,这虽然在技术上有意义,但不需要通常的Rails REST操作,因为没有操作模型,它们是硬编码的。但是,每个操作都会导致其他模型的更改。基本上我会创建一个动作控制器,如果我想要转到RESTful,请创建自定义REST动作。然而,看起来我不应该在这种情况下使用REST,并简单地为所有不同的操作,想法创建一个控制器? – Bob 2010-10-26 17:49:41
我已经更新了我的答案。以这种方式存储它们会使操作安全性等级变得微不足道,以实现其他功能:) – glebm 2010-10-27 03:31:11
谢谢,这是一个有创意的解决方案,但实现自定义REST操作似乎更简单。 – Bob 2010-10-28 17:08:24
首先,您必须问自己,REST是否对您的应用程序有意义。你在谈论“方法”和“行动”,而REST更多地是关于“资源”。资源类型的数量不取决于游戏动作的数量 - 每个玩家可以有一个资源,在其中发布其当前状态(*例如*攻击,防守,*等)。你能扩展更多关于你希望通过使用REST来完成的内容吗?或者更多的是流行语?这是一个实时游戏吗? – user359996 2010-10-25 06:25:17