2014-12-22 4 views
0

양식의 모든 오류를 캡처하고 오류가없는 경우 양식이 진행되는 원자 적 작업인지 확인하십시오. 다른 올바른 필드가 저장됩니다.모든 오류를 형태로 캡처하고 원 자성 보장 -

ActiveRecord::Base.transaction do 
    @var_types.each_with_index do |var,index| 
      begin 
      var.save! 
      puts "saving" 
      rescue 
      puts "rescued" 
      end 
    end 

위의 블록을 사용하고 있습니다.하지만이 블록은 모든 오류를 캡처하지만 원 자성은 보장되지 않습니다. 이 문제를 해결하는 방법은 무엇입니까?

편집 : 예는 사용자가 DB 규칙을 준수하지 않을 수 있습니다 여러 필드 및 여러 필드를 입력 할 수있는 양식과 같이, 그렇게 내가 기대하는 모든 오류에 표시 할 말 것

예 한 번만 저장하면 모든 오류가 발생하지만 계속해서 오류가 하나라도 있으면 올바른 변경 사항이 저장되지 않습니다.

답변

1

트랜잭션 외부에서 예외를 catch해야합니다.

트랜잭션이 예외가 당신의 코멘트를 읽은 후 트랜잭션 블록을

begin 
    ActiveRecord::Base.transaction do 
    @var_types.each_with_index do |var,index| 
     var.save! 
     puts "saving" 
    end 
    end 
rescue 
    puts "rescued" 
end 

UPDATE을 갈 때 롤백 할있다 : 당신이 내부 ActiveRecord::Rollback 올리면 : 여기에서 주목해야 할

ActiveRecord::Base.transaction do 
    raise ActiveRecord::Rollback unless @var_types.map(&:save).all? #passing here a block like { |res| res == true } is redundant. 
    redirect_to some_index_path, notice: "Everything saved" 
end 

render action: 'edit' # something didn't pass the validation, re-render the view 

것들 트랜잭션 블록을 사용하면 복구 할 필요가 없습니다 (http://api.rubyonrails.org/classes/ActiveRecord/Rollback.html에서 문서 읽기)

누군가가이 같은 것을 할 수있는, 당신이 편안하게 생각하지 않는 경우는, 예외 던지기에 본사를 둔 흐름을 운전 안된다고 말할 수 있습니다

all_saved = false # need to define this var outside, or it will a block-level variable, visible only in the block 
ActiveRecord::Base.transaction do 
    all_saved = @var_types.map(&:save).all? 
    raise ActiveRecord::Rollback unless all_saved 
end 

if all_saved 
    redirect_to some_index_path, notice: "Everything saved" 
else 
    render action: 'edit' # something didn't pass the validation, re-render the view 
end 
+0

내가 이것을 시도 할 것이다, 그러나이 캡처 것 모든 오류 및 첫 번째 오류를 직면에 종료하지? – Trancey

+0

다음과 같이 작동하는 몇 가지 샘플 코드로 답변을 업데이트했습니다 : 예외가 발생하면 트랜잭션이 롤백되고 예외가 catch되고, 그렇지 않은 경우 모든 내용이 저장됩니다 – Fer

+0

죄송합니다. code – Trancey

관련 문제