1

클래스에 대한 단일 테이블 상속 교사, 학생, 외부인 유형이 될 수있는 사람.단일 테이블 상속의 경우 폼 도우미

class Person < ActiveRecord::Base 

end 


class Teacher < Person 

end 

class Student < Person 

end 

class Outsider < Person 

end 

새 사용자를 등록하는 동안 경로와 양식에 변경해야 할 사항은 무엇입니까? 필자는 새로운 사용자를 등록하기위한 양식의 드롭 다운으로 구현 될 수있는 people 테이블에 "type"열 (문자열)이 있습니다. 사용자가 특정 유형의 Person으로 등록되도록 양식에서 수행해야하는 다른 작업이 있습니까? 노선도 변경해야합니까?

답변

1

형식 선택의 드롭 다운 목록을 양식에 추가하는 것을 제외하면 더 이상 할 일이 없습니다. 당신은 같은 일반적인 방법으로 사용자를 만들 수 있습니다

@user = Person.new params[:user] 

그러나 type 속성은 대량 할당 할 수없는, 그래서 당신은 별도로 할당해야합니다.

@user.type = sanitize_user_type params[:user][:type] 

있어서 sanitize_user_type 사용자 입력 값의 유효성을 검증하기 위해 사용된다.

새 사용자 생성 경로는 변경할 필요가 없습니다. 다른 경로를 변경해야하는지 여부는 요구 사항에 따라 다릅니다. 실제로 Teacher, Student, Outsider 및 상대 컨트롤러에 대한 경로를 추가하여 편안한 URL을 구축 할 수 있습니다.

2

한 가지 양식을 사용하여 모든 유형의 사람을 만들면 한 개의 컨트롤러 만 사용해야하므로 추가 경로를 추가 할 필요가 없습니다.

type 속성은 실제로 수동으로 인스턴스에 지정해야하는 것이 아니며 만들려는 모델 유형을 선택하여 자동으로 설정해야합니다.

는 컨트롤러와 뷰에서 어떻게 보이는지 모르겠어요,하지만 당신은 다음과 같이 작성하는 모델의 유형을 추출 할 수 있습니다 :

한편
class_type = params[:type].constantize 
@person = class_type.new 

, type 속성이 중첩되는 경우 당신의보기에서 form_for가 있다면, type 속성은 아마도 params [: person] [: type]과 같은 컨트롤러에 보내질 것입니다.이 경우, 새로운 인스턴스를 생성하기 전에 : person 해시에서 제거되어야합니다. 아마도 다음과 같은 것일 수 있습니다 :

class_type = params[:person].delete(:type).constantize 
@person = class_type.new(params[:person])