2011-01-05 20 views
12

コントローラーでActiveRecord::RecordNotUnique例外を処理するにはどうすればよいですか?ありがとうRails 3:ActiveRecord :: RecordNotUnique例外を処理する

編集:ユニークなコードを生成するときに例外が発生します。私はapplication_controller.rbで例外を処理することができますが、私が本当に必要なのは、再度生成されるコードであり、コントローラで実行する必要があります。

generate_code 
@couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 

EDIT2

generate_code 

begin 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code) 
rescue ActiveRecord::RecordNotUnique 
    #generate_code 
    @code = "111-11111" 
    @couponcode = Couponcode.new(:user_id => current_user.id, :code => @code)   
end 
+0

多分もっとコードですか?レコードを保存しようとするとその例外が発生していると思います。その部分はあなたの例には含まれていません。 – Heikki

+0

はい、そうです。ありがとうございました。 – donald

答えて

21
begin 
    # do stuff 
rescue ActiveRecord::RecordNotUnique 
    # handle the exception however you want to 
end 

http://ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html

それはあなたが頻繁に対処する必要があるものだ場合にもrescue_fromを使用することができます。

+0

新しいコードで質問を編集しました。私は救助のための@couponcodeなしで試しました。エラーは依然として同じですが、まだ処理されていない例外があります。 – donald

+0

エラーは '.new'行から来ていて、' .save'はどこから呼び出されていませんか? [ActiveRecord :: RecordNotUnique](http://api.rubyonrails.org/classes/ActiveRecord/RecordNotUnique.html)のドキュメントは、レコードがデータベースに保存されるときに発生することを示唆しています。いずれにしても、レスキューブロックで同じことをやろうとすると、長期的には痛みにつながるでしょう。ユーザーの立場から、エラーを予想している場合は、(検証とフォームエラーの使用など)より適切に対処する必要があります。 – idlefingers

+0

エラーが発生することは期待していませんが、問題が発生している場合は、問題の根底に立ち入ってみてください。二重コメント申し訳ありません、SOコメントの長さ制限! :) – idlefingers

1

一意性検証を追加して、レスキューを使わなくてもコードを変更することができます。

couponcode.rb

validates_uniqueness_of :code 

コントローラ:

@couponcode = Couponcode.new(:user_id => current_user.id) 
begin 
    couponcode.code = generate_code 
    # might want to break out after a limit here 
end until @couponcode.valid? 
@couponcode.save 

しかし、あなたはまた、UUIDを使用することができ、それはチェックせずに独自のだろう。

4

validate_uniqueness_ofこの重複したレコードの挿入がないことを保証するものではありません。

ご覧になりますhere