如何设计RESTful模型的不同“视图”?

时间:2009-04-30 21:04:59

标签: ruby-on-rails rest

这里的'view'是指模型属性的不同组合,而不是传统MVC的视图。例如,我有以下模型:

class Game < ActiveRecord::Base
  has_many :players
  belongs_to :status
  has_one :deck
  has_many :turns
  has_one :current_turn, :class_name => 'Turn', :conditions => ['turn_num = ?', '#{self.turn_num}']
end

我已经为游戏编写了一个full_xml方法,用于'正常'获取操作,这样我就可以包含某些属性的玩家和current_turn,然后我就不必进行GET了每个球员都在。我也不想在每个GET上包含所有属性以及Game模型的子项和子项属性

然而,现在,我想获得一个游戏历史,这是所有转弯(及其属性/孩子)。最初我想到了一个新的模型w / out相应的表,然后意识到这是不必要的,因为数据和关系已经存在于游戏中并且变成了模型。我还考虑过编写一个新动作,但我想我在某个地方读过,在RESTful世界中,除了核心7之外你不应该写任何动作。

顺便说一下,我在考虑返回xml,因为我使用的是Flex前端而不是rails视图。

2 个答案:

答案 0 :(得分:1)

你在这里有几个选项 - 我会使用“嵌套资源”,所以你最终得到一个/ game /:game_id /转向路线,它在Turns控制器上调用'index'。另一个选择是创建一个GameHistory控制器,如果有与游戏历史相关的其他逻辑,这可能很有用。

控制器和模型之间没有一对一的对应关系;然而,控制器和资源之间存在一对一的对应关系。游戏历史是与游戏完全不同的资源,就像用户会话资源与实际用户资源不同(这通常用于允许RESTful登录以及RESTful用户管理)希望这有助于:)

答案 1 :(得分:1)

是的,嵌套资源就是答案。 This Railscast很好地解释了这一点。我以前曾经简单地尝试过嵌套资源,并且无法让它工作。它返回所有子资源,而不仅仅是父资源的嵌套资源。这是因为我认为Rails会自动为我做这件事,但事实并非如此。 Railscast解释说你仍然需要对子资源的控制器进行更改,如下所示:

class TurnsController < ApplicationController
  # GET /turns
  # GET /turns.xml
  def index
    @game = Game.find(params[:game_id])
    @turns = @game.turns

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @turns.to_xml( :except => [:created_at, :updated_at] ) }
    end
  end
  ... more methods
end

您还必须编辑routes.rb文件。在这种情况下,我想要两个玩家和游戏轮次的嵌套路线,所以我这样做了:

map.resources :games do |game|
    game.resources :players
    game.resources :turns
end