Raylarda, doğrulama hataları dışında .save () 'nin başarısız olmasına neyin sebep olduğunu nasıl öğrenebilirim?


91

Dönen bir ActiveRecord modeli var truegelen valid?(ve .errors boş), ancak dönen falsegelen save(). Model örneği geçerliyse, kaydetmenin başarısız olmasına neyin sebep olduğunu nasıl öğrenebilirim?


7
Bu problemi birkaç hafta önce yaşadım. Bazı yeniden düzenleme, bir before_save işlevini her zaman yanlış döndüren bırakarak kaydetmenin başarısız olmasına neden oldu.
Jeff Paquette

1
@Jeff - teşekkürler, yanlış döndüren bir: before_save yöntemi olduğu ortaya çıktı. Nasıl buldun? Bu sadece kod incelemesi miydi?
kdt

Kod incelemesiydi ve sürüm kontrolüne karşı farklar yapıyordu.
Jeff Paquette

Yanıtlar:


49

Tüm geri aramalarınızı kontrol edin.

Modelde bir dizi değişiklik yaptıktan sonra başarısız olan "after_validate" yöntemine sahip olduğum ve "after_validate" yöntemine benzer bir sorun yaşadım. Model geçerliydi ancak "after_validate" yanlış döndürüyordu, bu yüzden eğer kullandıysam model.validdoğru dedim, ancak daha sonra kaydedersem bana doğrulama hataları verdi (after_validate geri aramasından geçti). Bu garipti.

Uygulama izlemesine bakın ve hangi kod satırının istisnayı artırdığını görebilmelisiniz.


2
Jeff'in yorumuna göre, sorunun yanlış döndüren bir ön-kaydetme geri araması olduğu ortaya çıktı.
kdt

3
@kdt - benim sorunum da buydu. Bunu düşünmemiştim çünkü before_save sadece bir özelliği ayarlamak içindir, ancak onu yanlış bir değere ayarladığı için, bu örtük olarak döndürülür ve bu da kaydetme işleminin sessizce başarısız olmasına neden olur. İşin iyi tarafı, şimdi bu kodu satırı ekleyerek düzeltme seçeneğim var "Hey! That's MY fake leg!" # Believe it or not, this is important. Bunu yapacağımdan değil. ;)
Nathan Long

2
Gerçek bir dönüş değeri sağlamanın güzel bir yolutrue.tap { do_something }
Nathan Long

vay, ne belirsiz bir konu. Yanlış dönen bir geri aramanın tasarruf etmeyi durduracağını asla tahmin edemezdim. Birisi beni bu konudaki belgelere yönlendirebilir mi? Bunu işaret ettiğiniz için teşekkürler!
andy


116

Patlama versiyonunu save!(sonunda bir ünlem işaretiyle) kullanmayı ve ortaya çıkan hatayı incelemeyi deneyin .


4
kayıt etmek! sadece bir RecordNotSaved atıyor (istisnanın .message'ını yazdırdığımda istisna sınıfının adını alıyorum). Daha fazla ayrıntı aramam gereken bir yer var mı?
kdt

1
Rails geliştirme modundaysanız, yığın izleme ile hatanın tam bir açıklamasını yazdırmalıdır. Herhangi bir ipucu için oraya bir göz atın ve / veya buraya gönderin.
Andy Lindeman

1
Konsolu kullanıyorum, nesneyi yüklüyorum (örneğin, o = Object.find #id), sonra o.save yapıyorum! cevabın dediği gibi. Neden tasarruf etmediğini yazdırır.
pduey

1
Bilginize, çağrı save!yükseltebilir ActiveRecord::RecordInvalid(doğrulamaları çalıştırdığı için) veya ActiveRecord::RecordNotSavedbu yüzden kurtarmak isteyeceğiniz şey budur.
Dennis

2
+1 çünkü bu, .savedoğrulamaya bağlı olmayan arızaların nasıl teşhis edileceğine dair temel soruya en az tatmin edici olmayan cevaptır . "En az tatmin edici olmayan" nitelik, bu yanıta değil, Rails'e atıfta bulunur.
Chuck Batson

112

Eğer @user.save(örneğin) dönerse false, tüm hataları almak için bunu çalıştırın:

@user.errors.full_messages

13
Soruda belirttiğim gibi .valid? doğrudur - yani doğrulama hatası yoktur. .Errors'ın da boş bir liste döndürdüğünü kontrol ettim (soruyu buna işaret edecek şekilde güncelledim)
kdt

3

Evet, tüm önceki * * geri aramalarımda doğru döndüğümden emin olarak bu sorunu çözdüm ve sonra çalışmaya başladım :)


-1

Yaşadığım sorun, modele doğrulamayı eklemeyi unutmuş olmamdı.

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.