2009-04-30 51 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