2015-05-10 10 views
5

Rails projemde benzersiz diziyle benzersizliği zorlamaya çalışıyorum. Ve kafa karıştırıcı bir şey buldum.Rails'te ActiveRecord :: RecordNotUnique'in nasıl işleneceği

sitemde bir kullanıcının kaydedilmesi gibi, hem benzersiz olması gerekir, bir e-posta adresi ve bir takma ad sağlamanız gerekir. Hem e-postaya hem de takma adlara benzersiz bir dizin ekliyorum. Ve yinelemeler geldiğinde, ben istisna ActiveRecord::RecordNotUnique istisnayı kurtarıyorum, şimdi burada soru, hangi alanın istisna neden olduğunu biliyordum?

Yardımlarınız için çok teşekkürler.

cevap

0

IMHO ayrıca modelinize uniqueness validators eklemeniz gerekir. Bu, Rails doğrulamaları ve hata iletilerini kullanmanıza olanak tanır.

# add to model 
validates :email, uniqueness: true 
validates :nickname, uniqueness: true 

Veritabanı düzeyinde benzersizliği sağlamak için benzersiz bir dizin olsa da yine de iyi bir fikirdir.

+0

teşekkürler @spickerman. Evet, teklik için doğrulayıcılarım var. Ama hala birden fazla sunucu üzerinde birden fazla tek boynuzlu işçiye sahip olduğumdan ve aynı zamanda uğraşmamız gereken eşzamanlılık durumları var. Veri tutarlılığını sağlamak için hala benzersiz bir dizine ihtiyacımız var. Aslında istediğim şey bu, benzersiz alan tarafından korunan iki alan varsa, hangisinin tetiklendiğini nasıl bilebilirim. – larryzhao

+0

Anladım. Bu durumda sadece ActiveRecord :: RecordNotUnique'den kurtarın ve tekrar kayıtta “geçerli” yi arayın. Bu, aradığınız bilgi ile kayıttaki 'hataları 'doldurur. – spickermann

+0

Tamam, teşekkürler. Evet, şimdi geçerli olanı kullanıyorum? Bu soruyu sadece daha iyi bir şey olup olmadığını görmek için gönderiyordum, çünkü 'geçerli?' Her şeyi tekrar çalıştırır. – larryzhao

-1

ActiveRecord, sizin nesne üzerinde doğrulamaları çalıştırmak için valid? yöntemi kullanabilirsiniz. false döndürürse, hangi alanların bir hata verdiğini belirlemek için hata mesajlarını görüntüleyebilirsiniz.

Örnek:

user = User.new({email: '[email protected]', nickname: 'non_unique_nickname'}) 

user.valid? #This will run validations 
=> false 

user.errors.messages 
=> {:nickname=>["has already been taken"]} 
+0

Evet, aslında tam olarak aynı şeyi yapıyorum. Fakat 'geçerli?' Herşeyi yeniden çalıştıracağından, daha iyi bir şey olup olmadığını görmek için bu soruyu yayınlıyorum. – larryzhao

İlgili konular