2011-04-13 3 views
0

레일 2.3을 사용하고 있습니다.입력란에 입력 된 레일스 관련 모델을 확인하는 방법

텍스트 상자를 사용하여 입력 한 belongs_to 연관 입력란의 유효성을 검사하려면 어떻게해야합니까? 예 : 블로그 포스트가 카테고리에 속하지만 정의를 사용하여 입력되지는 않지만 텍스트 상자에서 카테고리 이름 (고유하다고 가정 해 봅시다)으로 입력됩니다.

가능한 오류 : 잘못된 형식이며 DB에 해당 범주가 없습니다.

문자열을 연관에 직접 지정하면 AssociationTypeMismatch로 오류가 발생하므로 동일한 속성에 할당 할 수없고 사용자 정의 before_validate 메서드를 사용할 수 없습니다.

컨트롤러에서 변환 작업을 수행하고 모델의 오류 컬렉션에 추가하면 여전히 유효합니다 (유효성 검사가 시작되기 전에 오류 컬렉션이 지워졌다고 생각합니다).

어떻게하면 표준 오류 수집을 사용할 수 있습니까?

+0

카테고리 필드의 데이터 유형은 무엇입니까? –

+0

@Michael 필드가 참조 (정수)이고 입력이 문자열입니다. – lmz

답변

0

자바 스크립트 자동 완성 기능이있는 더미 텍스트 상자를 사용하는 것이 좋습니다. 해당 연결의 ID에 대한 양식에 숨겨진 필드를 배치하십시오. JS가 일치 목록을 반환하면 ID를 포함시키고 항목이 선택되면 숨겨진 ID 필드를 채 웁니다.

그렇지 않으면 도움이 될 수 있습니다. 이것은 테스트되지 않은 코드입니다.

# Assumed that "Obj" is the class of your belongs_to association 

attr_accessor :obj_name 
def obj_name= value 
    self.obj = Obj.find_by_name(params[:obj_name]) 
end 

validate :validate_obj 
def validate_obj 
    # If there's no obj, report an error on our pseudo-field 
    return if self.obj.present? 
    return if self.obj_name.blank? # Allow empty object if blank name was specified 
    error.add(:obj_name, "does not appear to be a valid obj name") 
end 
+0

"no object"/ nil이 유효한 값이기 때문에이 의미가 있습니까? 도움이 안돼. 나는 여기에 또 다른 속성 (attr_accessor를 사용하여 만든 속성일까요?)이 필요하다고 생각하기 시작했습니다. 사용자가 입력 한 문자열을 저장하고 유효성 검사시에만 객체를 확인합니다. – lmz

+0

attr_accessor를 사용하는 것이 좋은 방법입니다. get_id_from_name과 같은 setter를 재정 의하여 실제 속성을 설정하십시오. null 값을 허용하도록 편집했습니다. – aceofspades

관련 문제