1

我正在做我在 Rails 中的第一个更大的项目。它将是一个 RESTful API。我偶然发现的情况可以描述如下:我有模型'Person'和'Application'。

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 /applications/<id >/所有者/地址')。这甚至是推荐的 API 设计吗?

非常感谢。

4

1 回答 1

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

但请注意,用户可以在此处覆盖 url 中的这些默认参数,因此我将安全隐患留给您。

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

祝你好运!

于 2012-05-26T14:50:45.290 回答