Я просто хочу принести сюди новий маленький шматочок:
Тож я знайшов простіший спосіб отримати результат, якого хотів "AnApprentice".
Перш за все, якщо ви хочете налаштувати що-небудь у плагіні Devise, я настійно раджу скопіювати минулий код з "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ kontroleri | помічники | mailer ... "до потрібного файлу у вашому проекті.
[Редагувати] Або ви можете зробити ваш файл успадкованим із "звичайних" файлів розробки ... Як ... скажімо ... Ви хочете перезаписати лише одну функцію в devise / registrations_controller.rb, перший рядок у вашому користувальницькому користувальницькому режимі Контролером реєстрації буде:
class Users::RegistrationsController < Devise::RegistrationsController
[Редагувати 7 серпня 2013] Тепер Devise навіть пропонує інструмент для генерації контролерів: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Отже ... все одно ... мені вдалося отримати те, що "AnApprentice" хотів просто написати це (для більш чистого рішення див. Наступну велику редагування):
#/my_project/app/helpers/devise_helper.rb
module DeviseHelper
def devise_error_messages!
return "" if resource.errors.empty?
return resource.errors
end
end
І, на мій погляд, наступні рядки спрацювали досить добре:
<% devise_error_messages!.each do |key, value| %>
<div class="flash <%= key %>"><%= key %> <%= value %></div>
<% end %>
Ну ... тоді ви можете отримати доступ до помилок для конкретного атрибуту, як цей:
#Imagine you want only the first error to show up for the login attribute:
<%= devise_error_messages![:login].first %>
І ... Невеликий трюк, щоб мати лише одну помилку (першу, яку потрапили), що відображається за атрибутом:
<% 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 %>
Я знаю, що минуло деякий час з моменту опублікування цього питання, але я думаю, що це допоможе багатьом розробникам користувачів :).
Велика редакція:
Оскільки я люблю розширювати свій код, роблячи його більш чистим і ділитися ним з іншими, я нещодавно хотів змінити повідомлення devise_error_mes! метод для того, щоб використовувати його в моїх поглядах і змусити його відображати трюк, який я пояснив вище.
Отже, ось мій метод:
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
Нічого страшного тут, я повторно використовував написаний мною код, щоб показати лише один атрибут pey error, тому що часто перший є єдиним релевантним (наприклад, коли користувач забуває одне обов'язкове поле).
Я рахую ці "унікальні" помилки, і я роблю HTML-заголовок H2, використовуючи плюралізацію, і ставлю її перед списком помилок.
Тож тепер я можу використовувати "devise_error_messages!" як за замовчуванням, і він робить саме те, що я вже робив раніше.
Якщо ви хочете отримати доступ до певного повідомлення про помилку у вашому перегляді, я зараз рекомендую використовувати безпосередньо "resource.errors [: attribute] .first" або будь-яке інше.
Сея, Кулгар.