2010-05-27 1 views
1

ContactEmail, ContactLetter 및 ContactCall이 모두 상속하는 모델로 ContactEvent를 사용하여 단일 테이블 상속을 설정 중입니다.레일스에서 ​​단일 테이블 상속을위한 컨트롤러를 어떻게 만듭니 까?

하지만 라우팅 및 컨트롤러를 만드는 방법에 대해 잘 모르겠습니다.

예를 들어 전자 메일 유형으로 새 ContactEvent를 만들고 싶다고 가정 해 봅시다.

나는 다음을 수행 할 수있는 방법을 싶습니다

new_contact_event_path(contact, email) 

이 연락 모델 및 이메일 모델에서 인스턴스를 취할 것입니다. , 나는 contact_event_controller 알 필요가 상상

내부 ...

@contact_event.type = (params[:email]) # get the type based on what was passed in? 
    @contact_event.event_id = (params[:email]) #get the id for the correct class, in this case Email.id 

이 어떻게 작동하는지 그냥 확실하지 ....

답변

0

내가 컨트롤러 (어쩌면 뷰) 것에 대한 각 자원 유형. ContactLetter 등을위한 ContactEmail 컨트롤러를 추가하십시오. 기본 클래스 인 ContactEvent에 대해 신경 쓰지 마십시오. 그런 다음 경로 같은 것을 읽을 것입니다 :

new_contact_email_path(@contact) or new_contact_letter_path(@contact) 

컨트롤러의 행동은 그들이 대표하는 적합한 모델, 즉 사용합니다 : 자원이 아닌 별도의 당신이 당신의 세 가지 유형을 유지할 수있는 경우

@contact_email = ContactEmail.new(params[...]) 

을 하나의 컨트롤러에 유형을 전달하고 올바른 객체를 구축하려고하면 훨씬 쉽게 삶을 찾을 수 있습니다. 단점은 프런트 엔드에서 더 많은 링크/양식 /보기가 필요할 수도 있지만 사용자의 관점에서 볼 때 응용 프로그램에 따라 다르지는 않을 수 있습니다.

+0

어떻게 중복성을 줄일 수 있습니까? 내가이쪽으로가는 이유는 오직 하나의 컨트롤러에 코드가 있기 때문에 지금 당장은 복제가 많다. ... – Angela

+0

가장 기본적인 RESTFUL 컨트롤러는 똑같은 마이너스와 약간의 작은 차이를 보인다. 사용중인 모델, 플래시 메시지 등. 유사한 자원이 3 개 발견되면 각자 매우 유사하더라도 각자 자신의 존재에 대한 권리가 있습니다. 이 (및 일반 레일) 복제를 줄이려면 resources_controller와 같은 플러그인을 사용할 수 있습니다. 뷰의 관점에서 일반적인 부분을 공유 부분으로 끌어 올 수 있습니다. 렌더링되는 위치에 따라 고유해야하는 하나 또는 두 개의 객체를 전달할 수 있습니다. – tsdbrown

+0

흠 ... 그렇다면 나는 그것들을 단일 테이블 상속으로 통합하려고해서는 안됩니다. – Angela