Seringkali saya perlu memeriksa apakah beberapa nilai kosong dan menulis bahwa "Tidak ada data" seperti itu:
@user.address.blank? ? "We don't know user's address" : @user.address
Dan ketika kita memiliki sekitar 20-30 bidang yang perlu kita proses dengan cara ini, itu menjadi jelek.
Apa yang saya buat adalah kelas String diperpanjang dengan or
metode
class String
def or(what)
self.strip.blank? ? what : self
end
end
@user.address.or("We don't know user's address")
Sekarang sudah terlihat lebih baik. Tapi masih mentah dan kasar
Bagaimana akan lebih baik untuk menyelesaikan masalah saya. Mungkin akan lebih baik untuk memperpanjang ActiveSupport class
atau menggunakan metode pembantu atau mixin atau yang lainnya. Apa yang idealogi, pengalaman, dan praktik terbaik Anda dapat memberitahu saya.
sumber
Phrogz memberi saya ide di komentar PofMagicfingers, tapi bagaimana dengan menimpa | sebagai gantinya?
sumber
Karena Anda melakukan ini di Ruby on Rails, sepertinya Anda sedang mengerjakan sebuah model. Jika Anda menginginkan nilai default yang wajar di mana pun di aplikasi Anda, Anda dapat (misalnya) mengganti
address
metode untukUser
model Anda .Saya tidak tahu ActiveRecord cukup baik untuk memberikan kode yang baik untuk ini; di Sekuelnya akan menjadi seperti ini:
... tetapi untuk contoh di atas, ini sepertinya Anda akan mencampurkan logika tampilan ke dalam model Anda, yang sebenarnya bukan ide yang bagus.
sumber
Metode atau Anda mungkin memiliki beberapa efek samping yang tidak diinginkan, karena nilai alternatif (default) selalu dievaluasi, meskipun string tidak kosong.
Sebagai contoh
akan membuat pekerjaan ekstra bahkan jika alamat tidak kosong. Mungkin Anda bisa memperbaruinya sedikit (maaf karena satu baris membingungkan, mencoba membuatnya tetap pendek):
sumber
a=2 ; a == 2 ? "ok" : @b = 3 ; @b; #=> nil
Mungkin lebih baik untuk memperluas ActiveRecord atau model individu daripada String.
Dalam pandangan Anda, Anda mungkin lebih menyukai pola yang lebih eksplisit seperti
sumber
Rubi:
RoR:
sumber