2011-02-24 4 views
8

단일 테이블 상속을 통해 2 명의 다른 사용자가 상속하는 기본 클래스가 있습니다. 모든 하위 클래스가 여러 가지 이유로 동일한 컨트롤러/뷰를 공유하기를 원합니다. 유일한 차이점은 모델의 기능입니다.단일 컨트롤러, 다중 (상속 된) 클래스 (레일 3)

그러나 "stuff"를 사용하려고 시도하면 instance_of_child에 대한 올바른 페이지를 찾을 수 없다는 불만이 있습니다.

'/ subclass'=> 리다이렉트 ('/ parent')으로 엉망으로 만들려고했지만 이상한 링크는 의미가 없습니다. 어떤 제안? 나는 레일스에서 ​​꽤 새롭다. 그리고 나는 루트에 대한 나의 이해를 인정한다 .rb는 여전히 제한적이다. 그러나 나는 그것이 내가보아야 만하는 곳이 어디 인지도 완전히 확신하지 못한다. http://www.alexreisner.com/code/single-table-inheritance-in-rails에서

답변

12

:

혹시 당신이 부모 클래스를 추가 할 때 은 아마 당신의 LINK_TO의 많은 및 form_for 방법 오류를 던져 알고 응용 프로그램 레일 존재하는 에 STI를 추가하려고 한 경우 . ActionPack은 객체의 클래스를보고 경로와 URL을 확인하고 새 하위 클래스에 대해 매핑 된 경로가 없기 때문입니다. 당신은 불구하고 나는 그것을 추천하지 않는다, 그래서 같은 경로를 추가 할 수 있습니다

# NOT recommended: 
map.resources :cars,  :as => :vehicles, :controller => :vehicles 
map.resources :trucks,  :as => :vehicles, :controller => :vehicles 
map.resources :motorcycles, :as => :vehicles, :controller => :vehicles 

이는 특정 증상을 완화. form_for를 사용하는 경우 양식 필드의 이름은 여전히 ​​ (예 : params [: vehicle] [: color] 대신 params [: car] [: color] )입니다. 대신 부모 클래스에 model_name 메소드를 구현하여 루트를 공격해야합니다. 나는 에 대한 모든 문서를이 기술을 보지 못했다, 그래서 이것은 매우 비공식이지만, 말이하고 레일에 나를 위해 완벽하게 작동 2.3 3 :

def self.inherited(child) 
    child.instance_eval do 
    def model_name 
     Vehicle.model_name 
    end 
    end 
    super 
end 

이 아마 혼란 보이는, 그래서 내가 설명 을 보자

을 당신이 URL을 창출하는 방법 를 호출 할 때 (예 : LINK_TO ("자동차"자동차)), ActionPack 통화 모드 지정된 개체 (여기서 자동차) 의 클래스에있는 l_name. 그러면 의 이라는 객체가 무엇인지 결정하기 위해 이라는 특별한 유형의 문자열이 반환됩니다. 우리가 여기서하고있는 모든 는 부모 클래스의 이름이 경로를 사용하여 부모 클래스 (차량)에 속하는 것으로 자동차, 트럭 및 오토바이 서브 클래스를 참조 할 것 그래서 ActionPack 차량의 서브 클래스의 MODEL_NAME 방법을 재정의한다 (VehiclesController)은 URL이 인 모든 위치에 생성됩니다. 이는 레일스 리소스 스타일 (RESTful) URL을 사용하여 이라고 가정합니다. (그렇지 않다면하세요.)이 MODEL_NAME 호출을 직접 조사하기

의 ActionController :: RecordIdentifier #의 model_name_from_record_or_class 방법에 대한 레일 소스 코드를 참조하십시오. 레일 2.3에서 특별 문자열은 레일 3 에서 ActiveSupport :: MODELNAME의 인스턴스는, 그것이 ActiveModel의이다 :: 이름

+0

이 내가 찾던 정확히 것입니다. 라우팅 테이블을 망치는 것은 나쁜 해결 방법처럼 보였습니다. 그렇습니다. 나는 그것이 내 양식을 엉망으로 만들고 있다는 것을 알아 차렸습니다. 그래서 위의 예제를 약간 수정하여 클래스 이름에 맞게 만들면 솔루션에서 내 문제를 해결할 수 있습니다. 당신은 내가 그 여분의 컨트롤러를 만들고 유지하는 것을 얼마나 두려워하는지 알지 못합니다. – user632657

+0

다행히 들으세요! :) –

관련 문제