2009-04-30 48 views
0

「視圖」在這裏指的是模型屬性的不同組合,而不是傳統MVC的視圖。例如,我有以下型號:如何設計REST式模型的不同「視圖」?

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中包含遊戲模型的所有屬性和兒童以及兒童的屬性。但是,現在我想要獲得一個遊戲歷史記錄,這是所有輪到的(以及它們的屬性/子項)。起初,我想到了一個新的模型,沒有相應的表格,然後意識到這並不是必須的,因爲數據和關係已經存在於遊戲中並轉變爲模型。我也想過寫一個新的動作,但我認爲我在RESTful世界的某個地方閱讀過,你不應該寫任何除核心以外的任何動作7.

順便說一句,我想在這裏返回XML,因爲我使用的是Flex前端而不是rails視圖。

回答

1

你有幾個選項 - 我會使用「嵌套資源」,所以你最終得到一個/遊戲/:game_id /轉彎路線,它在Turns控制器上調用'index'。另一種選擇是創建一個GameHistory控制器,如果有其他邏輯與您的遊戲歷史記錄相關聯,這可能會很有用。

控制器和模型之間沒有一一對應關係;然而控制器和資源之間存在一對一的對應關係。遊戲歷史是與遊戲完全不同的資源,就像用戶會話資源與實際用戶資源不同(這通常用於允許RESTful登錄以及RESTful用戶管理)希望這有助於:)

+0

嵌套的URI與REST無關。 – aehlke 2009-07-20 22:24:11

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