这里的'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视图。
答案 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