2012-05-26 3 views
1

레일즈에서 처음으로 더 큰 프로젝트를 진행하고 있습니다. RESTful API가 될 것입니다. 내가 우연히 만난 상황은 다음과 같이 설명 할 수 있습니다. 'Person'및 'Application'모델이 있습니다.레일 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> 

문제는 "복수"응용 프로그램 자원에서 둥지 단수 소유자 및 관리자 자원 때, 모든 경로가 동일한 PARAMS으로, 동일한 'PeopleController의 행동에 결국한다는 것이다.

첫 번째 두 자원이 읽기 전용 작업의 관점에서 마지막 역할을하는 경우 (예를 들어 한 요청만으로 특정 응용 프로그램 관리자의 주소를 검색 할 수있는 경우) '보너스/응용 프로그램/<id>/소유자/주소 '). 그것도 권장되는 API 디자인입니까?

고마워요.

답변

1

나는 이것이 실제로 유효한 REST 접근법이라고 생각하지만 한 수준 높은 주소 중첩을 제거합니다. 그렇다면 사람들은 자신의 얕은 자원이 될 것이고 자신의 주소를 가질 것입니다. REST 중첩 수준이 1을 넘기 때문에이 작업을 수행합니다. http://guides.rubyonrails.org/routing.html을 참조하십시오. 이제 다른 문제를 해결해 보겠습니다. 컨트롤러는 사용자가 '소유자'또는 '관리자'를 요청했음을 어떻게 알 수 있습니까? 여기에 사용자가 그래서 난 URL에 이러한 기본 PARAMS을 덮어 쓸 수 있다는

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

하지만 조심 : 당신의 PeopleController의 다음

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

resources :people do 
    resources :address 
end 

: 한 가지 방법은 바로이 같은 경로에 기본 PARAMS을 사용하는 것입니다 당신에게 보안 함의를 남겨 둡니다.

다른 방법은 전체 URL 주소를 생성하는 request.fullpath를 확인하는 것입니다. 그것에서 관리자 또는 소유자를 검색 할 수 있습니다.

행운을 빈다.

+0

고마워요, 결국 저는 협회 자체를 자원으로 고려하여 실제로 해결했습니다. 나는 여기에서 새로운데, 내 질문을 편집하여 내 솔루션을 포함시키는 것이 일반적입니까? T. – user1241530

+0

나는 여기 너무 새로운 :-). 그러나 나는 그것을 비밀로 유지하는 것보다 더하는 것이 낫다고 생각합니다. – Renra

+0

@ user1241530 질문에 대한 유효한 답변이있는 경우 별도의 답변을 추가 할 수 있습니다. 대답이 그다지 좋지 않을 수도 있으므로 질문에 대답을 포함시키지 마십시오. 이 방법은 당신의 질문과 당신의 대답은 다른 표를 가질 것입니다. –

관련 문제