di halaman edit pengguna saya, ada baris sebagai berikut:
<%= devise_error_messages! %>
Masalahnya adalah ini tidak menghasilkan kesalahan dengan cara standar yang dilakukan oleh aplikasi lainnya:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
Pertanyaan saya adalah, bagaimana cara saya mendapatkan pesan kesalahan yang dirancang agar berfungsi seperti yang lain yang menggunakan flash.each?
Terima kasih.
ruby-on-rails
devise
AnApprentice
sumber
sumber
Jawaban:
Saya mencoba mencari tahu sendiri. Saya baru saja menemukan masalah ini masuk di Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Jose mengatakan bahwa
devise_error_messsages!
metode itu hanya sebuah rintisan (meskipun mengandung implementasi) dan kita seharusnya menimpanya / menggantinya. Akan lebih baik jika ini ditunjukkan di suatu tempat di wiki, itulah sebabnya saya kira ada beberapa orang seperti kita yang telah menebak.Jadi saya akan mencoba membuka kembali modul dan mendefinisikan kembali metode, secara efektif mengesampingkan implementasi default. Saya akan memberi tahu Anda bagaimana hasilnya.
Memperbarui
Yap, itu berhasil. Saya membuat
app/helpers/devise_helper.rb
dan mengesampingkannya seperti ini:Jadi mengetahui hal ini, saya dapat memodifikasi metode untuk menampilkan pesan kesalahan seperti yang saya inginkan.
Untuk membantu Anda memecahkan masalah asli Anda: Inilah yang asli
devise_helper.rb
di Github . Lihatlah bagaimana pesan kesalahan dilalui:Itu akan membantu Anda memulai. :)
Pembaruan lain
The
resource
objek sebenarnya model yang sedang digunakan oleh merancang (gambar go).Tampaknya juga didefinisikan dalam lingkup yang lebih tinggi (mungkin berasal dari controller), sehingga dapat diakses di berbagai tempat.
Di mana saja di Pembantu Anda
Pandangan Anda
sumber
Solusi di bawah ini berfungsi dengan rancangan terbaru seperti yang sekarang (4.1.1) dan Rails 4.2.6. Tetapi sangat sederhana sehingga saya tidak melihat alasan mengapa itu tidak akan bekerja 10 tahun dari sekarang;)
Jika Anda ingin mendaur ulang pesan kesalahan Anda dan membuatnya terlihat sama di aplikasi Anda, saya akan merekomendasikan sesuatu seperti ini (cara saya telah belajar dengan Michael Hartl tut):
Buat sebagian untuk pesan kesalahan:
layouts/_error_messages.html.erb
Letakkan di dalam kode berikut (di sini saya menggunakan beberapa kelas bootstrap 3):Sekarang Anda memiliki sesuatu yang dapat didaur ulang dan Anda dapat menggunakannya di seluruh papan. Alih-alih merancang standar:
Sebut saja dalam formulir Anda seperti ini:
Anda bisa menaruhnya dalam bentuk apa pun. Alih-alih melewati sumber daya merancang Anda bisa melewati variabel dari formulir Anda seperti ini:
sumber
Saya tahu sudah lama sejak pertanyaan ini diposting, tetapi saya hanya ingin mengomentari apa yang saya temukan. Dua orang yang sudah menjawab sangat membantu saya dan saya hanya ingin berkontribusi.
Anda akan melihat seluruh Menyusun bahwa ada panggilan menggunakan
render_with_scope
. Saya percaya ini adalah metode yang didefinisikan oleh merancang dan pada dasarnya menerapkan lingkup saat ini untuk tampilan selanjutnya yang diberikan.Mengapa ini relevan? Rencanakan berisi kesalahan Anda dalam
resource.errors
( tidak@resource.errors
). Rancang bekerja dengan baik jika Anda ingin menggunakannya di luar kotak, jadi untuk berbicara.Masalah dengan kesalahan ini muncul jika Anda mulai mengubah perilaku manajemen pengguna Anda. Dengan menambahkan
redirect_to
ataurender
(bukannyarender_with_scope
) di mana Rancangan sebelumnya tidak memiliki satu, Anda pada dasarnya membuang pesan kesalahan. Ini membuat Devise tidak ramah untuk modifikasi, menurut saya.Solusi saya adalah ini
dan
Blok kode yang terakhir mengambil pesan kesalahan Devise sebagai sebuah array dan menambahkannya
flash[:notice]
(sebagai sebuah array). Setiap pesan akan dicetak satu baris sekaligus. Jika saya punya waktu, saya pikir saya akan mengubah bagaimana Rancangan menangani pesan kesalahan untuk melakukan ini di seluruh aplikasi saya, karena tampaknya jauh lebih bersih untuk memiliki satu sistem pesan kesalahan daripada dua.sumber
Saya memecahkan ini mirip dengan YoyoS, dengan membuat
app/helpers/devise_helper.rb
dan menempatkan ini di dalamnya:Bekerja!
sumber
Saya hanya ingin membawa potongan kecil baru di sini:
Jadi saya menemukan cara yang lebih mudah untuk mendapatkan hasil yang diinginkan "AnApprentice".
Pertama-tama, jika Anda ingin mengkustomisasi apa pun dalam plug-in Devise, saya sangat menyarankan Anda untuk menyalin melewati kode dari "\ Ruby_repertory \ lib \ ruby \ permata \ 1.9.1 \ permata \ devise-version \ app \ controllers | helpers | mailer ... "ke file yang Anda inginkan dalam proyek Anda.
[Sunting] Atau Anda dapat membuat file Anda mewarisi dari file merancang "normal" ... Seperti ... katakan ... Anda ingin menimpa hanya satu fungsi di dalam merancang / registrations_controller.rb, baris pertama kustom Pengguna Anda pengendali pendaftaran adalah:
[Sunting 7 Agustus 2013] Sekarang Rancangan bahkan menyediakan alat untuk menghasilkan pengontrol: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Jadi ... ngomong-ngomong ... Saya berhasil mendapatkan apa yang "AnApprentice" inginkan hanya menulis ini (untuk solusi yang lebih bersih, lihat edit besar berikut):
Dan, dalam pandangan saya, baris berikutnya bekerja dengan cukup baik:
Baiklah ... maka Anda dapat mengakses kesalahan untuk atribut tertentu seperti ini:
Dan ... Trik kecil untuk hanya memiliki satu kesalahan (yang pertama ditangkap) muncul per atribut:
Saya tahu sudah lama sejak pertanyaan ini diposting, tapi saya pikir itu akan membantu banyak pengguna merancang :).
Edit Besar:
Karena saya suka memperpanjang kode saya, membuatnya lebih bersih dan membaginya dengan orang lain, saya baru-baru ini ingin mengubah devise_error_messages! metode untuk menggunakannya dalam pandangan saya dan membuatnya menampilkan trik yang saya jelaskan di atas.
Jadi, inilah metode saya:
Bukan masalah besar di sini, saya menggunakan kembali kode yang saya tulis dalam pandangan saya untuk menunjukkan hanya satu atribut kesalahan pey, karena sering yang pertama adalah satu-satunya yang relevan (seperti ketika pengguna lupa satu bidang yang diperlukan).
Saya menghitung kesalahan "unik" dan saya membuat judul H2 HTML menggunakan pluralize dan menaruhnya SEBELUM daftar kesalahan.
Jadi sekarang, saya bisa menggunakan "devise_error_messages!" sebagai default dan itu membuat persis apa yang sudah saya render sebelumnya.
Jika Anda ingin mengakses pesan kesalahan tertentu dalam tampilan Anda, saya sekarang merekomendasikan untuk menggunakan langsung "resource.errors [: atribut] .first" atau apa pun.
Seya, Kulgar.
sumber
Saya menggunakan Rancangan di Rails 3 dan kode flash Anda cukup identik dengan apa yang saya dapatkan. Di aplikasi saya, kode berfungsi seperti yang diharapkan; yaitu merancang pesan kesalahan adalah output dengan sisa pesan flash saya:
Coba kode persis ini dan lihat apakah ada bedanya - atribut ID yang berbeda mungkin membantu.
sumber
Saya datang ke ini dan itu bekerja sejauh ini. Itu menambahkan merancang pesan ke flash, sehingga dapat digunakan seperti biasa. Harap perhatikan bahwa saya baru di Ruby dan Rails ...
Edit:
Maaf saya menjalankan penjaga dan beberapa perilaku yang tidak diinginkan hadir. Karena
after_filter
dipanggil setelah rendering sehingga tidak berfungsi seperti yang diharapkan. Jika seseorang tahu cara memanggil metode setelah tindakan tetapi sebelum rendering ...Tapi Anda bisa menggunakan sesuatu seperti itu sebagai gantinya:
Di
views/shared/_messages.html.erb
sumber
Jika Anda ingin dapat menampilkan lebih dari satu flash dari jenis yang diberikan (: waspada,: pemberitahuan, dll ...) dan tidak membuang waktu Anda mencoba memodifikasi perilaku permata, ini adalah solusi yang saya gunakan dengan Merancang. Saya cukup yakin itu bisa digunakan dengan permata apa pun yang menggunakan pesan flash.
Hal pertama yang harus dilakukan, di application_controller.rb Anda, tambahkan ini:
Hal kedua yang harus dilakukan, menampilkan pesan flash Anda dengan ini di application.html.erb (atau di mana pun Anda inginkan):
Hal ketiga yang harus dilakukan, setiap kali Anda ingin menambahkan pesan flash di pengontrol apa pun, lakukan ini:
sumber
Buat DeviseHelper:
Menurut Anda, gantikan
Untuk:
sumber
Memang, sedikit hacky, tapi saya menggunakan pembantu ini (app / helpers / devise_helper.rb) untuk mengambil flash dan menggunakan yang jika diatur maka default ke
resource.errors
. Ini hanya berdasarkan pada pembantu yang ada di lib merancang.sumber
Jika Anda mencari dukungan dari devise_error_messages maka Anda dapat melakukannya dengan menambahkan ke resource.errors
Jika Anda menumpang pengendali registrasi, mungkin terlihat seperti
sumber
Cara yang sangat mudah untuk menampilkan pesan kesalahan untuk setiap bidang
letakkan untuk setiap bidang dengan nama bidang dalam kurung siku di bawah setiap baris tempat Anda ingin menampilkan pesan kesalahan sebaris.
sumber
Untuk menunjukkan kesalahan Anda dari controller Anda dengan hanya kesalahan pertama yang muncul.
sumber
Hanya untuk menambahkan jawaban Eric Hu di atas di mana semua pernyataan If digunakan, lebih baik lakukan sesuatu seperti ini sebagai gantinya.
sumber
saya cukup melakukan ini, bekerja untuk saya: di app / helpers / , saya membuat file devise_helper.rb
di semua file tampilan saya ubah
untuk:
bagi saya itu membuat dalam pandangan saya edit dan pengguna baru:
harap ini akan membantu Anda;)
sumber
<%= devise_error_messages! %>
dan tidak menjawab pertanyaan. Pertanyaannya adalah bagaimana menerapkan flash ke setiap pesan.sumber
Saya suka melakukannya persis seperti yang dilakukan di controller Rancangan lain dengan cheat ini.
sumber
Agar materialisecss menampilkan pesan kesalahan rancangan sebagai roti panggang, saya menambahkan kode ini di app / helpers / devise_helper.rb
Saya yakin mereka akan menjadi cara terbersih untuk menulisnya tetapi terbangun dengan sempurna
sumber
DeviseHelper#devise_error_messages!
sudah usang dan akan dihapus di versi utama berikutnya.Rancang sekarang menggunakan parsial bawah
devise/shared/error_messages
untuk menampilkan pesan kesalahan secara default, dan membuatnya lebih mudah untuk disesuaikan. Perbarui tampilan Anda untuk mengubah panggilan dari:untuk:
sumber
Saya baru saja membuat
app/helpers/devise_helper.rb
seperti John tetapi mengalahkan metode seperti itu:Dengan ini saya tidak perlu memodifikasi yang lain. Apakah itu ide yang buruk? Saya baru mengenal rail, jangan ragu untuk mengoreksi saya. Terima kasih.
sumber
Saya baru saja menyatakan devise_error_messages! sebagai penolong kosong. Dan secara manual mengambil dan menangani kesalahan dalam _errors umum parsial untuk aplikasi saya. Tampak seperti solusi paling sederhana dan saya tidak harus melalui semua file devise dan menghapus panggilan ke penangan kesalahan.
sumber