Di rails, bagaimana saya bisa mengetahui apa yang menyebabkan a .save () gagal, selain kesalahan validasi?


91

Saya memiliki model ActiveRecord yang kembali truedari valid?(dan .errors kosong), tetapi kembali falsedari save(). Jika contoh model valid, bagaimana saya bisa mengetahui apa yang menyebabkan penyimpanan gagal?


7
Saya mengalami masalah ini beberapa minggu yang lalu. Beberapa pemfaktoran ulang telah meninggalkan fungsi before_save yang kembali salah sepanjang waktu, yang menyebabkan penyimpanan gagal.
Jeff Paquette

1
@Jeff - terima kasih, ternyata ada metode: before_save yang mengembalikan false. Bagaimana Anda mengetahuinya? Apakah itu hanya pemeriksaan kode?
kdt

Itu adalah inspeksi kode, dan melakukan perbedaan terhadap kontrol versi.
Jeff Paquette

Jawaban:


49

Periksa semua panggilan balik Anda.

Saya mengalami masalah seperti ini di mana saya memiliki dan metode "after_validate" yang gagal setelah saya membuat banyak perubahan pada model. Model itu valid tetapi "after_validate" mengembalikan false, jadi jika saya menggunakannya model.valid, katanya benar, tetapi jika saya menyimpannya, model itu memberi saya kesalahan validasi (diteruskan dari callback after_validate). Aneh sekali.

Lihat jejak aplikasi dan Anda akan dapat melihat baris kode mana yang memunculkan pengecualian.


2
Sesuai komentar Jeff, masalahnya ternyata callback before_save menghasilkan false.
kdt

3
@kdt - itulah masalah saya. Saya tidak memikirkannya karena before_save hanya dimaksudkan untuk menyetel properti, tetapi karena menyetelnya ke nilai yang salah, itu secara implisit dikembalikan dan itu membuat penyimpanan gagal secara diam-diam. Sisi baiknya, saya sekarang memiliki opsi untuk memperbaiki kode ini dengan menambahkan baris "Hey! That's MY fake leg!" # Believe it or not, this is important. Bukannya saya akan melakukan itu. ;)
Nathan Long

2
Cara yang bagus untuk memastikan nilai pengembalian yang sebenarnya adalahtrue.tap { do_something }
Nathan Long

wow, sungguh masalah yang tidak jelas. Tidak akan pernah menduga bahwa callback yang mengembalikan false akan berhenti menyimpan. Bisakah seseorang mengarahkan saya ke dokumen tentang ini? Terima kasih telah menunjukkan hal ini!
andy


116

Coba gunakan versi bang save!(dengan tanda seru di akhir) dan periksa kesalahan yang dihasilkan.


4
menyimpan! hanya melempar RecordNotSaved (ketika saya mencetak. pesan pengecualian, saya hanya mendapatkan nama kelas pengecualian). Adakah tempat saya harus mencari lebih detail?
kdt

1
Jika Anda berada dalam mode pengembangan Rails, itu akan mencetak deskripsi lengkap tentang kesalahan dengan jejak tumpukan. Lihat di sana untuk mendapatkan petunjuk dan / atau posting di sini.
Andy Lindeman

1
Saya menggunakan konsol, memuat objek (misalnya, o = Object.find #id), lalu lakukan o.save! seperti yang dikatakan jawabannya. Ini mencetak mengapa itu tidak menyimpan.
pduey

1
FYI, panggilan save!dapat menimbulkan ActiveRecord::RecordInvalid(karena menjalankan validasi) atau ActiveRecord::RecordNotSaveditulah yang ingin Anda selamatkan.
Dennis

2
+1 karena ini adalah jawaban yang paling tidak memuaskan untuk pertanyaan mendasar tentang bagaimana mendiagnosis .savekegagalan yang bukan karena validasi. Kualifikasi "paling tidak memuaskan" mengacu pada Rails, bukan jawaban ini.
Chuck Batson

112

Jika @user.save(misalnya) kembali false, maka jalankan ini untuk mendapatkan semua kesalahan:

@user.errors.full_messages

13
Seperti yang saya sebutkan dalam pertanyaan, .valid? benar - yaitu tidak ada kesalahan validasi. Saya telah memeriksa bahwa .errors mengembalikan daftar kosong juga (saya telah memperbarui pertanyaan untuk menunjukkannya)
kdt

3

Ya, saya memperbaiki masalah ini dengan memastikan saya mengembalikan true di semua callback before_ * saya kemudian mulai berfungsi :)


-1

Masalah yang saya hadapi adalah saya lupa menambahkan validasi ke model.

class ContactGroup < ActiveRecord::Base
  validates_presence_of :name
end
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.