2012-09-24 1 views
2

모델이 유효성 검사 오류를 포착한다고 가정 해 봅시다. 일반적으로이 오류는 컨트롤러가 처리하지만 모델에 의해 자동으로 처리 할 수 ​​있습니까?레일스에서 ​​모델 유효성 검증 오류를 복구 할 수 있습니까?

가 실질적으로 내가 각 Note에 대한 고유 ID uid을 생성 할 모델은 다음과 같습니다

class Note < ActiveRecord::Base 
    validates_uniqueness_of :uid 
    # ... some code to generate uid on after_initialize 
end 

를 내가 가진 가장 가까운입니다

class Note < ActiveRecord::Base 
    validates_uniqueness_of :uid 
    # ... some code to generate uid on after_initialize 

    after_rollback :repair 

    protected 

    def repair 
    if self.errors[:uid].size > 0 
     self.uid = generate_uid 
    end 
    self.save # Try again 
    end 
end 

내 솔루션과 함께 즉각적인 문제 : (1) 모델 인스턴스에 여전히 컨트롤러에서 볼 수있는 오류가 있습니다. 오류를 제거하는 방법을 모르겠습니다. (2) 수리 방법은 재귀 적이다.

+2

나는 이런 식으로 가지 않을 것이다. 이전/이후 필터 또는 유효성 검사 중에 모델을 다시 저장하는 것은 문제의 훌륭한 처방입니다. –

+0

@ErezRabih는 맞습니다. 실제 uuid 생성기를 사용하는 것 외에도, 고유 한 제약 조건으로 안전이 실패한 경우 다시 시도하는'''save_with_repair'''와 같은 추가 메서드를 만들 것이라고 생각합니다. – phoet

답변

0

고유 한 것으로 보장되고 모델에 오버 헤드를 추가하지 않는 진정한 UUID를 사용합니다. 모델에 고유성 유효성 검사를 수행하면 무언가가 존재하는지 파악하기 위해 데이터베이스에 도달해야하기 때문에 약간의 오버 헤드가 추가되며 여전히 보장되지 않습니다.

체크 아웃 UUID를 생성하는이 루비 프로젝트 : https://github.com/assaf/uuid/

2

나는 모델 (아마 after_validation 콜백 사용 될 수 있습니다)에서 오류를 포착하고 처리하는 방법은 아마 당신이 할 수있는,이 확신하는 동안 이 경우 생성하려는 uid이 생성 할 때 고유한지 확인하여 문제를 피하십시오.

Ryan Bates offered this method for generating unique tokens in a RailsCast

하십시오 before_create 콜백의 사용

def generate_token(column) 
    begin 
    self[column] = SecureRandom.urlsafe_base64 
    end while User.exists?(column => self[column]) 
end 

, 즉 before_create { generate_token(:uid) }, 각 모델에 고유 ID를 가질 것이다.

이 모든 내용은 @Beerlington이 UUID에 관한 좋은 점을 제기했다고 전합니다.

업데이트 : 주어진 방법은 User 모델에서 정의 될 것으로 예상됩니다. 예를 들어 ...while Note.exists?...으로 변경하고 싶습니다.

관련 문제