Rails 3:两个单一的嵌套资源,一个模型

时间:2012-05-26 12:00:47

标签: ruby-on-rails ruby-on-rails-3 rest

我正在研究我在Rails中的第一个更大的项目。它将是一个RESTful API。 我偶然发现的情况可以描述如下: 我有模特'人'和'申请'。

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”操作结束,并使用相同的参数。

如果前两个资源在只读操作方面作为最后一个资源(例如,您可以只使用一个请求检索特定应用程序的管理器的地址,'GET /应用程序/&LT; ID&GT; /所有者/不会忽略)。这甚至是推荐的API设计吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

我认为它确实是一种有效的REST方法,但我会删除一级地址的深层嵌套。然后人们将成为自己的浅层资源,因此拥有自己的地址。我这样做是因为不建议使用超过1级的REST嵌套。请参阅http://guides.rubyonrails.org/routing.html现在让我们解决另一个问题。控制器如何知道用户请求“所有者”或“经理”。一种方法是在这样的路线中使用默认参数:

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

但请注意,此处用户可以在网址中覆盖这些默认参数,这样我就会对您产生安全隐患。

另一种方法是检查request.fullpath,它产生完整的url地址。在其中,您可以搜索经理或所有者。

祝你好运!