Я просто хочу принести новый маленький кусочек сюда:
Итак, я нашел более простой способ получить результат, которого хотел «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-ошибки, потому что часто первый является единственным релевантным (например, когда пользователь забывает одно обязательное поле).
Я считаю эти "уникальные" ошибки и создаю заголовок HTML-кода H2, используя множественное число, и помещаю его ДО списка ошибок.
Так что теперь я могу использовать "devise_error_messages!" по умолчанию, и он отображает именно то, что я уже делал раньше.
Если вы хотите получить доступ к конкретному сообщению об ошибке в своем представлении, я сейчас рекомендую использовать непосредственно «resource.errors [: attribute] .first» или что-то еще.
Сея,
Kulgar.