2012-05-26 70 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如果您有问题的有效答案,您可以添加一个单独的答案。不要在问题中包含答案,因为答案可能不是最好的答案。这样你的问题和答案就会有不同的选票。 –