Apakah ada praktik terbaik untuk menentukan jenis kesalahan khusus di aplikasi Ruby library (gem) atau Ruby on Rails? Secara khusus:
- Di mana mereka berada secara struktural dalam proyek? File terpisah, diuraikan dengan definisi modul / kelas yang relevan, di tempat lain?
- Apakah ada konvensi yang menetapkan saat ke dan kapan untuk tidak membuat kesalahan tipe baru?
Perpustakaan yang berbeda memiliki cara yang berbeda dalam melakukan sesuatu, dan saya belum melihat adanya pola yang nyata. Beberapa perpustakaan selalu menggunakan jenis kesalahan khusus sementara yang lain tidak menggunakannya sama sekali; beberapa memiliki semua kesalahan memperluas StandardError sementara yang lain memiliki hierarki bersarang; beberapa hanya definisi kelas kosong, yang lain memiliki segala macam trik pintar.
Oh, dan hanya karena saya merasa ingin memanggil "tipe kesalahan" ini agak ambigu, yang saya maksud adalah ini:
class AuthenticationError < StandardError; end
class InvalidUsername < AuthenticationError; end
sumber
httparty
: github.com/jnunemaker/httparty/blob/…Exceptions
modul?/lib
mungkin bukan tempat untuk kesalahan. Mereka sangat spesifik aplikasi dan saya mendapat kesan bahwa kode yang saya masukkan/lib
dimaksudkan untuk menjadi kode yang dapat digunakan kembali dalam aplikasi lain.Unable to autoload constant Exceptions, expected /app/lib/exceptions.rb to define it
pilihan lain akan menjadi satu kelas per pengecualian saya pikirSaya pikir untuk memiliki file sumber yang kohesif dalam proyek Anda, Anda harus mendefinisikan kesalahan di kelas yang dapat membuangnya dan tidak ke tempat lain.
Beberapa heirarki dapat membantu - ruang nama bagus dalam menjaga string yang berlebihan dari nama tipe - tetapi itu lebih merupakan masalah selera - tidak perlu berlebihan, asalkan Anda memiliki setidaknya satu jenis pengecualian khusus dalam aplikasi yang Anda gunakan untuk membedakan antara kasus pengecualian 'disengaja' dan 'tidak disengaja'.
sumber
di rel Anda bisa membuat
app/errors
direktorirestart spring / server dan itu harus mengambilnya
sumber
raise FooError, "Example message..."
atauraise FooError.new("Example message...")
Ini adalah pertanyaan lama, tetapi saya ingin berbagi bagaimana saya menangani kesalahan khusus di Rails, termasuk melampirkan pesan kesalahan, pengujian, dan bagaimana cara mengatasinya dengan
ActiveRecord
model.Membuat Kesalahan Khusus
Pengujian (terkecil)
Dengan ActiveRecord
Saya pikir perlu dicatat bahwa jika bekerja dengan
ActiveRecord
model, pola populer adalah menambahkan kesalahan pada model seperti yang dijelaskan di bawah ini, sehingga validasi Anda akan gagal:Ketika validasi dijalankan, metode ini akan membonceng kembali ke
ActiveRecord::RecordInvalid
kelas kesalahan ActiveRecord dan akan menyebabkan validasi gagal.Semoga ini membantu!
sumber
Untuk memastikan bahwa autoloading berfungsi seperti yang diharapkan di Rails 4.1.10 untuk beberapa kelas kesalahan khusus, Anda ingin menentukan file yang terpisah untuk masing-masingnya. Ini harus bekerja dalam pengembangan dengan reload dinamis.
Ini adalah cara saya mengatur kesalahan dalam proyek terbaru:
Di
lib/app_name/error/base.rb
dan kesalahan khusus berikutnya, seperti pada
lib/app_name/error/bad_stuff.rb
Anda kemudian dapat memanggil kesalahan Anda melalui:
sumber
lib/app_name/error.rb
uninitialized constant MyController::AppName
. Saya menelepon kenaikan di controller saya