【问题标题】:Going strictly RESTful on Rails在 Rails 上严格执行 RESTful
【发布时间】:2011-04-30 01:24:13
【问题描述】:

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

任何见解都将不胜感激。

【问题讨论】:

  • 首先,您必须问自己,REST 是否对您的应用程序有意义。您在谈论“方法”和“动作”,而 REST 更多的是关于“资源”。资源类型的数量不取决于游戏动作的数量——您可以为每个玩家拥有一个资源,您可以在其中发布他们的当前状态(例如进攻、防守等 /i>)。您能否进一步扩展您希望通过使用 REST 实现的目标,或者这更像是一个流行语?这是实时游戏吗?

标签: ruby-on-rails rest


【解决方案1】:

攻击、防御等都是同一种资源: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,而只是为所有不同的操作、想法创建一个控制器?
  • 我已经更新了我的答案。像这样存储它们使得动作安全许可级别等操作变得微不足道:)
  • 谢谢,这是一个创造性的解决方案,尽管实现自定义 REST 操作似乎更简单。
猜你喜欢
  • 2014-12-14
  • 2012-02-14
  • 1970-01-01
  • 2015-09-05
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多