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:
class Users::RegistrationsController < Devise::RegistrationsController
[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):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
Dan, dalam pandangan saya, baris berikutnya bekerja dengan cukup baik:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Baiklah ... maka Anda dapat mengakses kesalahan untuk atribut tertentu seperti ini:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
Dan ... Trik kecil untuk hanya memiliki satu kesalahan (yang pertama ditangkap) muncul per atribut:
<% if resource.errors.any? %>
<% saved_key = "" %>
<% devise_error_messages!.each do |key, value| %>
<% if key != saved_key %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
<% saved_key = key %>
<% end %>
<% end %>
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:
def devise_error_messages!
html = ""
return html if resource.errors.empty?
errors_number = 0
html << "<ul class=\"#{resource_name}_errors_list\">"
saved_key = ""
resource.errors.each do |key, value|
if key != saved_key
html << "<li class=\"#{key} error\"> This #{key} #{value} </li>"
errors_number += 1
end
saved_key = key
end
unsolved_errors = pluralize(errors_number, "unsolved error")
html = "<h2 class=\"#{resource_name}_errors_title\"> You have #{unsolved_errors} </h2>" + html
html << "</ul>"
return html.html_safe
end
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.