2011-03-28 4 views
1

하나의 양식에서 두 모델의 속성을 업데이트하고 있습니다.레일을 업데이트 할 때 두 모델의 오류 메시지를 표시합니다.

User.transaction do 
      begin 
      @user.update_attributes!(params[:user]) 
      @board.update_attributes!(params[:board]) 
      rescue ActiveRecord::RecordInvalid 
     end 
     end 

@ user.update_attributes가 오류를 생성하면 트랜잭션이 중지되고 오류 메시지가보기에 표시됩니다.

그러나 @user와 @board를 모두 업데이트하고 두 가지 모두에 대한 오류 메시지를 가져 와서 사용자가 모든 실수를 한 번에 해결할 수있게하려고합니다.

어떻게하면됩니까?

대단히 감사합니다.

답변

0

당신이 할 수있는 ... 쾅 버전을 사용 두 속성 값 메소드가 모두 실행되어 두 객체에 대한 오류 메시지를 가져올 수 있습니다. 데이터베이스에 변경 사항이 유지되지 않더라도 두 객체 중 하나가 유효하지 않습니다.

0

@user.update_attributes!(params[:user]) 메소드 이름에 실수가 있다고 생각하거나 @user.update_attributes(params[:user])이어야합니다. 또는 올바른지 또는 다른 코드가 올바른지 여부를 확인하기 위해 params 값을 교차 검사해야합니다. 이 도움을받을 수 있습니다 update_attributes

1

update_attributes의 강타 (!) 버전을 사용하지 않아도됩니다. 시도 :

User.transaction do 
    if @user.update_attributes(params[:user]) && @board.update_attributes(params[:board]) 
    ...do stuff... 
    else 
    render ... (go back to the action the user got here from) 
    end 
end 

그런 다음보기 코드에서 오류가 if @user.errors.any? 같은 조건을 사용하여 차단했습니다.

update_attribtues의 bang 버전과 대부분의 activerecord 메소드는 실패 할 경우 오류를 발생시키고 일반 버전은 false를 반환하고 저장하지 않으므로 실패 할 때마다 사용할 수 있습니다. 성공/실패에 기반한 행동.

User.transaction do 
    @user.update_attributes(params[:user]) 
    @board.update_attributes(params[:board]) 
    raise ActiveRecord::Rollback unless @user.valid? && @board.valid? 
end 

이 보장됩니다 : 당신이 어떤 이유로 500 화면이나 뭔가를 보여주고 싶은 경우에 실패하거나 확인하지의 경우에만 다음

관련 문제