2011-01-05 22 views
12

Denetleyicide ActiveRecord::RecordNotUnique istisnasını nasıl ele alabilirim? TeşekkürlerRaylar 3: ActiveRecord komutunu çalıştırın :: RecordNotUnique Exception

Edit: Özel bir kod oluştururken bu özel durumu alıyorum. Uygulama_controller.rb'deki istisnayı halledebilirim ama gerçekten istediğim kodun tekrar üretilmesi ve kontrolörde yapılması gerekiyor.

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

Edit2: Eğer sık ​​sık başa gereken bir şey varsa

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

Daha fazla kod görüntülüyorsunuz? Kaydı kaydetmeye çalışırken bu istisnayı alıyorsunuz ve bu bölüm sizin örneğinizde yer almıyor. – Heikki

+0

Evet, bu doğru. Teşekkür ederim. – donald

cevap

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

Ayrıca rescue_from kullanabilirsiniz.

+0

Soruyu yeni kodla düzenledim. Kurtarmada @couponcode olmadan denedim. Hata hala aynı, hala ele alınma istisnası var. – donald

+0

Hatanın '.new' satırından geldiğini ve' .save'nin çağrılmadığını bilmiyor musunuz? [ActiveRecord :: RecordNotUnique] için belgeler (http://api.rubyonrails.org/classes/ActiveRecord/RecordNotUnique.html), kayıt veritabanına kaydedildiğinde yükseltileceğini önerir. Her durumda, bir kurtarma bloğunda hemen hemen aynı şeyi yapmaya çalışmak, uzun vadede acıya yol açacaktır. Hatayı bekliyorsanız, kullanıcı açısından, daha incelikle (doğrulama ve form hataları kullanma gibi) ilgilenmeniz gerekir. – idlefingers

+0

Hatayı beklemiyorsanız, ancak çok şey oluyorsa, yalnızca onu bastırmak değil, sorunun köprüsünü bulmaya çalışmalısınız. Çifte yorum için özür dilerim, SO yorum uzunluğu sınırlaması! :) – idlefingers

1

Benzersiz bir doğrulama ekleyebilir ve yine de kurtarma kullanmak zorunda kalmadan kodu değiştirme şansınız olabilir.

couponcode.rb

validates_uniqueness_of :code 

kontrolör:

@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 

Ama aynı zamanda bir uuid kullanabilir ve bir çeki olmayan benzersiz olacaktır.

4

Bu doğrulama yöntemini kullanarak validate_uniqueness_of, yinelenen kayıt eklerinin bulunmadığını garanti etmez.

here

İlgili konular