我正在研究我在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设计吗?
非常感谢。
答案 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地址。在其中,您可以搜索经理或所有者。
祝你好运!