2012-05-26 73 views
1

我正在開發我的第一個更大的Rails項目。它將是一個RESTful API。 我偶然發現的情況可以描述爲: 我有模型'Person'和'Application'。Rails 3:兩個獨特的嵌套資源,一個模型

class Person < ActiveRecord::Base 
    has_many :managed_applications, :class_name => "Application", :foreign_key => "manager_id" 
    has_many :owned_applications, :class_name => "Application", :foreign_key => "owner_id" 

    # other associations 
    has_many :adresses 
end 

class Application < ActiveRecord::Base 
    belongs_to :manager, :class_name => "Person" 
    belongs_to :owner, :class_name => "Person" 
end 

我應該如何設計我的控制器和路由,以便我有以下相當不言自明的資源工作?

/applications/<id>/owner 
/applications/<id>/manager 
/people/<id> 

的問題是,這是鳥巢奇異所有者和管理者的資源下一個「複數」的應用程序資源時,所有的路由在同一個「把PeopleController」行動結束了,與同PARAMS。

如果前兩個資源作爲最後一個資源在只讀操作方面發揮作用(例如,您可以只通過一個請求獲取特定應用程序的管理器地址,那麼GET /應用程序/ <ID> /所有者/地址')。那甚至是推薦的API設計?

非常感謝。

回答

1

我認爲這確實是一種有效的REST方法,但我會刪除深層嵌套的地址。然後人們將成爲自己的淺層資源,因此擁有自己的地址。我這樣做是因爲REST級別超過1的嵌套是令人沮喪的。請參閱http://guides.rubyonrails.org/routing.html現在我們來解決另一個問題。管理員將如何知道用戶請求「所有者」或「經理」。一種方法是使用默認PARAMS就在這樣的路線:

resources :applications do 
    resource :owner, :controller => 'people', :defaults => {:type => 'owner'} 
    resource :manager, :controller => 'people', :defaults => {:type => 'manager'} 
end 

resources :people do 
    resources :address 
end 
你把PeopleController

然後:

class PeopleController < ApplicationController 
    def show 
    @type = params[:type] # can be manager, owner or nil 
    end 
end 

但要注意的是,這裏的用戶可以在URL重寫這些PARAMS,所以我給您帶來安全隱患。

另一種方法是檢查產生完整url地址的request.fullpath。在這裏你可以搜索經理或所有者。

祝你好運!

+0

謝謝,最終我通過將關聯本身視爲資源來解決問題。我是新來的,編輯我的問題以包含我自己的解決方案是否很常見? T. – user1241530

+0

我也是新來的:-)。但我認爲這樣做比保密更好。 – Renra

+0

@ user1241530如果您有問題的有效答案,您可以添加一個單獨的答案。不要在問題中包含答案,因爲答案可能不是最好的答案。這樣你的問題和答案就會有不同的選票。 –