Я просто хочу принести сюда новый кусочек:
Итак, я нашел более простой способ получить результат, который хотел «AnApprentice».
Прежде всего, если вы хотите настроить что-либо в подключаемом модуле Devise, я настоятельно рекомендую вам скопировать код из "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers". | helpers | mailers ... "в файл, который вы хотите включить в свой проект.
[Edit] Или вы можете сделать свой файл наследованием от "обычных" файлов devise ... Например ... скажем ... Вы хотите перезаписать только одну функцию в 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_messages! , чтобы использовать его в своих представлениях и отображать трюк, который я объяснил выше.
Итак, вот мой метод:
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, потому что часто первый из них является единственным актуальным (например, когда пользователь забывает одно обязательное поле).
Я считаю эти "уникальные" ошибки и делаю заголовок H2 HTML, используя множественное число и помещаю его ПЕРЕД списком ошибок.
Итак, теперь я могу использовать "devise_error_messages!" по умолчанию, и он отображает именно то, что я уже делал раньше.
Если вы хотите получить доступ к конкретному сообщению об ошибке в вашем представлении, я рекомендую использовать напрямую "resource.errors [: attribute] .first" или что-то еще.
Сея, Кульгар.