2011-01-15 9 views
4

は私のコントローラのこのコードを考えてみましょう:Rails:「保存」が失敗するかどうかを事前に知る方法?

def create 
    change_some_db_values 
    buyer = Buyer.new(params[:buyer]) 
    if buyer.save 
    redirect_to(:action => 'index') 
    else 
    render('new') 
    end 
end 

私はbuyer.saveが失敗したりしません場合は、事前に知っていただきたいと思います。もし失敗するなら、私はchange_some_db_valuesを実行したくありません。どうすればこれを達成できますか?

答えて

7

良い方法はtransactionにすべての変更を配置し、saveが失敗した場合にロールバックすることがあります。

def create 
    Buyer.transaction do 
    change_some_db_values 
    buyer = Buyer.new(params[:buyer]) 
    buyer.save! 
    end 
end 
+0

が実際に - 私はかなりこのソリューションのように、それは余分な妥当性チェックが事前に保存していdoes notの、しかし、change_some_db_valuesは、そのトランザクションの出てくるだけ買い手場合に実行する必要があります。新記録?その後の追加保存 –

+0

@omar私はそれらの 'change_some_db_values'が同じデータベース内で起こっていると思います。したがって、 'buyer.save!'が失敗した場合、それらの変更があった場合を含め、トランザクション全体がロールバックされます。 – troelskn

+0

Ah - 申し訳ありませんが、質問を間違って読んでしまった - 保存が失敗した場合には必ず 'change_some_db_values'を実行すると思っていました。 –

1

valid?関数を使用して、オブジェクトが操作に有効かどうかを確認できます。ここでは、このアプローチを実装するサンプルコードです:

def create 
    # change_some_db_values 
    buyer = Buyer.new(params[:buyer]) 
    if buyer.valid? 
    change_some_db_values 
    end 
    if buyer.save 
    redirect_to(:action => 'index') 
    else 
    render('new') 
    end 
end 
関連する問題