Menggunakan Rails, saya mencoba mendapatkan pesan kesalahan seperti "Bidang lagu tidak boleh kosong" saat disimpan. Melakukan hal berikut:
validates_presence_of :song_rep_xyz, :message => "can't be empty"
... hanya menampilkan "Rep Lagu XYW tidak boleh kosong", yang tidak bagus karena judul bidangnya tidak ramah pengguna. Bagaimana saya bisa mengubah judul bidang itu sendiri? Saya dapat mengubah nama bidang di database, tetapi saya memiliki beberapa bidang "lagu" dan saya harus memiliki nama bidang tertentu.
Saya tidak ingin meretas proses validasi rails dan saya merasa harus ada cara untuk memperbaikinya.
sumber
errors.add :base, msg
? Saya ingin tahu kolom tentang kesalahan ini, jadi saya bisa menampilkannya di kolom formulir yang benar.The password is wrong.
atauThe email address is not valid.
bukannyaPassword is wrong.
danEmail is not valid.
.Dalam model Anda:
Menurut Anda
Jika Anda melakukannya
Anda mendapatkan pesan kesalahan ini dengan nama atribut
jika Anda ingin mendapatkan pesan kesalahan untuk satu atribut tunggal
sumber
validates_presence_of :address1, :message => :put_some_address_please
Coba ini.
Saya menemukan ini di sini .
Ini cara lain untuk melakukannya. Apa yang Anda lakukan adalah mendefinisikan metode human_attribute_name pada kelas model. Metode ini meneruskan nama kolom sebagai string dan mengembalikan string untuk digunakan dalam pesan validasi.
Kode di atas berasal dari sini
sumber
Ya, ada cara untuk melakukan ini tanpa plugin! Tapi itu tidak sebersih dan seanggun menggunakan plugin yang disebutkan. Ini dia.
Dengan asumsi Rails 3 (saya tidak tahu apakah itu berbeda di versi sebelumnya),
simpan ini di model Anda:
dan dalam tampilan, bukannya pergi
seperti ketika kita menggunakan generator scaffold, masukkan:
Dan Anda hanya akan mendapatkan pesan yang Anda tentukan dalam model, tanpa nama atribut.
Penjelasan:
Sejauh ini kami hanya menampilkan satu pesan saja, selalu untuk kesalahan pertama. Jika Anda ingin menampilkan semua kesalahan, Anda dapat mengulang di hash dan menunjukkan nilainya.
Harapan itu membantu.
sumber
Kode Rails3 dengan pesan yang dilokalkan sepenuhnya:
Dalam model, user.rb mendefinisikan validasi
Di config / locales / en.yml
sumber
Dalam metode validasi khusus, gunakan:
errors.add(:base, "Custom error message")
karena add_to_base telah ditinggalkan.
errors.add_to_base("Custom error message")
sumber
Terkait dengan jawaban yang diterima dan jawaban lain di daftar :
Saya mengonfirmasi bahwa garpu nanamkim untuk custom-err-msg bekerja dengan Rails 5, dan dengan pengaturan lokal.
Anda hanya perlu memulai pesan lokal dengan tanda sisipan dan seharusnya tidak menampilkan nama atribut dalam pesan.
Model didefinisikan sebagai:
dengan yang berikut ini
en.yml
:item.errors.full_messages
akan ditampilkan:bukannya yang biasa
Name You can't create an item without a name
sumber
Saya sarankan menginstal permata custom_error_message (atau sebagai plugin ) yang awalnya ditulis oleh David Easley
Ini memungkinkan Anda melakukan hal-hal seperti:
sumber
gem "custom_error_message"
ke Gemfile Anda - lihat github untuk lebih jelasnyaSalah satu solusinya mungkin dengan mengubah format kesalahan standar i18n:
Defaultnya adalah
format: %{attribute} %{message}
sumber
Ini cara lain:
Jika Anda menggunakan templat ini:
Anda dapat menulis sendiri pesan khusus seperti ini:
Dengan cara ini, karena garis bawah, pesan lengkap menjadi "Pesan khusus saya", tetapi ruang ekstra pada awalnya tidak terlalu mencolok. Jika Anda benar-benar tidak menginginkan ruang ekstra di awal, cukup tambahkan
.lstrip
metode ini.Metode String.lstrip akan menghilangkan ruang ekstra yang dibuat oleh ': _' dan akan membiarkan pesan kesalahan lainnya tidak berubah.
Atau bahkan lebih baik, gunakan kata pertama dari pesan khusus Anda sebagai kuncinya:
Sekarang pesan lengkapnya adalah "Pesan khusus saya" tanpa ruang tambahan.
Jika Anda ingin pesan lengkap dimulai dengan kata dengan huruf besar seperti "URL tidak boleh kosong" tidak dapat dilakukan. Alih-alih mencoba menambahkan beberapa kata lain sebagai kuncinya:
Sekarang pesan lengkapnya adalah "URL tidak boleh kosong"
sumber
errors.add(:_, 'foobar')
dan mendapatkan 'foobar' sebagai pesanLakukan saja seperti biasa:
Tetapi tampilkan seperti ini sebagai gantinya
Kembali
Metode pelokalan jelas merupakan cara yang "tepat" untuk melakukan ini, tetapi jika Anda melakukan sedikit, proyek non-global dan hanya ingin cepat - ini jelas lebih mudah daripada file hopping.
Saya menyukainya karena kemampuan untuk menempatkan nama bidang di suatu tempat selain dari awal string:
sumber
Jika Anda ingin mendaftar semuanya dalam daftar yang bagus tetapi tanpa menggunakan nama yang tidak ramah manusiawi yang kasar, Anda dapat melakukan ini ...
sumber
Menurut Anda
Ketika Anda ingin mengganti pesan kesalahan tanpa nama atribut, cukup tambahkan pesan dengan ^ seperti:
sumber
Saya mencoba mengikuti, bekerja untuk saya :)
1 pekerjaan.rb
2 jobs_controller.rb
3 _form.html.erb
sumber
Ini kode saya yang dapat berguna bagi Anda jika Anda masih membutuhkannya: Model saya:
Lalu saya telah membuat pembantu untuk menampilkan pesan:
sumber
Satu-satunya cara saya bisa mendapatkan semua penyesuaian yang saya inginkan adalah menggunakan
after_validation
panggilan balik untuk memungkinkan saya memanipulasi pesan kesalahan.Izinkan pesan validasi dibuat seperti biasa, Anda tidak perlu mencoba dan mengubahnya di pembantu validasi.
buat
after_validation
panggilan balik yang akan menggantikan pesan validasi di back-end sebelum sampai ke tampilan.Dalam
after_validation
metode ini Anda dapat melakukan apa pun yang Anda inginkan dengan pesan validasi, seperti string normal! Anda bahkan dapat menggunakan nilai dinamis dan memasukkannya ke dalam pesan validasi.Metode after_validation akan memiliki cakupan yang jauh lebih besar daripada pembantu validasi rel bawaan, jadi Anda akan dapat mengakses objek yang Anda validasi seperti yang Anda coba lakukan dengan object.file_name. Yang tidak berfungsi dalam pembantu validasi tempat Anda mencoba memanggilnya.
Catatan: kami menggunakan
^
untuk menyingkirkan nama atribut di awal validasi sebagaimana @Rystraum menunjukkan referensi permata inisumber
graywh's jawaban adalah yang terbaik jika itu benar-benar lokal berbeda dalam menampilkan nama bidang. Dalam hal nama bidang dinamis (berdasarkan bidang lain untuk ditampilkan), saya akan melakukan sesuatu seperti ini
metode full_message pada yang lain adalah apa yang digunakan rel di dalam metode full_messages, sehingga itu akan memberikan kesalahan Rails normal untuk kasus lain (Rails 3.2 dan lebih tinggi)
sumber