在Rails上严格执行RESTful

时间:2010-10-25 06:16:35

标签: ruby-on-rails rest

我正在开发一款游戏应用程序(移动前端,Rails后端),并试图决定是否应该严格使用RESTful。如果我这样做,我似乎会创造更多的控制器。例如,我需要实现几个游戏操作,如攻击,防御等。如果我严格遵守RESTful,我将需要为每个游戏操作创建一个控制器,只需一个REST操作(更新)。如果我去非RESTul并且创建了一个通用的战斗控制器,那么我就可以为攻击,防御等创建方法/动作。似乎更加麻烦,严格来说是RESTful。

非常感谢任何见解。

1 个答案:

答案 0 :(得分:8)

攻击,防御等都属于同一种资源:Action

E.g:

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

这只是为了大致了解如何做得好。