2011-09-11 8 views
0

: email, display_name 및 handle이라는 세 개의 필드가있는 User 모델이 있습니다. 핸들은 display_name에서 장면 뒤에서 생성됩니다.레일 유효성 검사 문제

나는 다음과 같은 검증을 사용하고 있습니다 :

validates :display_name, :presence => :true, :uniqueness => { :message => "Sorry, another user has already chosen that name."}, :on => :update 
    validates :email, :presence => :true, :uniqueness => { :message => "An account with that email already exists." } 

나는 모델의 to_param로 핸들을 사용합니다. 사용자가 이미 존재하는 : display_name을 제출하여 유효성 검사에 실패한 경우이를 변경하고 양식을 다시 제출하려고 시도하면 Rails는 전자 메일의 유효성 검사로 새 핸들을 사용하는 것으로 보입니다 - 다시 말해서 전자 메일이 현재 사용자에게 속해 있지 않으며 전자 메일의 유효성 검사가 실패합니다. 이 시점에서 레일스는 변경된 표시 이름/핸들이 조회에 사용할 핸들이며 업데이트 작업은 새 핸들을 기반으로 사용자를 찾을 수 없기 때문에 전혀 완료 할 수 없다고 가정합니다.

다음은 업데이트 방법입니다 :

def update 
    @user = User.find_by_handle(params[:id]) 
    @handle = params[:user][:display_name] 
    @user.handle = @handle.parameterize 
    ... 
end 

검증 먼저 중복 이메일에 실패 할 때이 문제가 발생하지 않습니다, 그래서 나는 그것이 내가 update 메소드를 작성한 방법에 대해 뭔가 있으리라 믿고있어 - - 어쩌면 모델에서 핸들을 설정해야합니까?

답변

2

어쩌면 모델의 핸들을 설정해야합니까?

^이것은.

컨트롤러가 이와 같은 작업을 수행 할 장소가 아닙니다. 배후에서 사용자의 제어 범위를 벗어나는 모델 논리가 컨트롤러 코드에 삽입되는 이유는 무엇입니까?

before_save 필터를 사용하십시오. 선택한 표시 이름이 사용 가능하다고 판단되고 레코드가 유효한 것으로 확인 된 후에 만 ​​실행됩니다. 이러한 방식으로 handle은 db에 실제로 커밋 될 때까지 캐시 된 레코드에서 변경되지 않으므로 잘못 생성 된 URL의 문제점을 제거합니다.

before_save :generate_handle 
... 

def generate_handle 
    self.handle = display_name.parameterize 
end 
+0

나는 왜 컨트롤러에서 설정했는지 기억이 나지 않습니다 ... 아마 편의를 잃었을 것입니다. – Slick23