на моей странице редактирования пользователя есть следующая строка:
<%= devise_error_messages! %>
Проблема в том, что это не выводит ошибки стандартным образом, как это делает остальная часть приложения:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
У меня вопрос: как заставить сообщение об ошибке devise работать, как другие, использующие flash.each?
Спасибо.
ruby-on-rails
devise
AnApprentice
источник
источник
Ответы:
Я сам пытаюсь в этом разобраться. Я только что обнаружил, что эта проблема зарегистрирована на Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Хосе говорит, что
devise_error_messsages!
метод - это всего лишь заглушка (хотя и содержит реализацию), и мы должны переопределить / заменить его. Было бы хорошо, если бы на это указали где-нибудь в вики, поэтому я думаю, что есть несколько людей, подобных нам, которые гадают.Итак, я попытаюсь снова открыть модуль и переопределить метод, фактически переопределив реализацию по умолчанию. Я дам вам знать, как это происходит.
Обновить
Ага, это работает. Я создал
app/helpers/devise_helper.rb
и переопределил его так:Итак, зная это, я могу изменить метод для отображения сообщений об ошибках так, как я хочу.
Чтобы помочь вам решить исходную проблему: вот оригинал
devise_helper.rb
на Github . Взгляните, как просматриваются сообщения об ошибках:Это должно помочь вам начать работу. :)
Еще одно обновление
resource
Объект на самом деле модель , которая используется по завещанию (Go Figure).Он также, похоже, определен в более высокой области (вероятно, исходящий от контроллера), поэтому к нему можно получить доступ из различных мест.
Где угодно в вашем помощнике
Ваше мнение
источник
Нижеприведенное решение работает с последней версией на данный момент (4.1.1) и Rails 4.2.6. Но это настолько просто, что я не вижу причины, по которой это не сработает через 10 лет;)
Если вы хотите переработать свои сообщения об ошибках и сделать так, чтобы они выглядели одинаково в вашем приложении, я бы порекомендовал что-то вроде этого (как я узнал с Майклом Хартлом tut):
Создайте партиал для сообщений об ошибках:
layouts/_error_messages.html.erb
вставьте следующий код (здесь я использую несколько классов начальной загрузки 3):Теперь у вас есть что-то пригодное для вторичной переработки, и вы можете использовать его повсеместно. Вместо стандартного устройства:
Назовите это в вашей форме так:
Вы можете оформить его в любом виде. Вместо передачи ресурса разработки вы можете передать переменную из формы следующим образом:
источник
Я знаю, что этот вопрос был давно опубликован, но я просто хотел прокомментировать то, что нашел. Два человека, которые уже ответили, оказали мне огромную помощь, и я просто хотел внести свой вклад.
Вы увидите, что в Devise используются вызовы
render_with_scope
. Я считаю, что это метод, определенный в devise, и в основном применяет текущую область видимости к следующему отображаемому представлению.Почему это актуально? Devise содержит ваши ошибки внутри
resource.errors
(а не@resource.errors
). Devise отлично работает, если вы хотите использовать его, так сказать, из коробки.Проблемы с этими ошибками возникают, если вы начинаете изменять свое поведение управления пользователями. Добавляя
redirect_to
илиrender
(вместоrender_with_scope
) там, где у Devise его раньше не было, вы в основном отбрасываете сообщения об ошибках. На мой взгляд, это делает Devise неприемлемым для модификации.Мое решение таково
и
Последний блок кода принимает сообщения об ошибках Devise в виде массива и добавляет его
flash[:notice]
(как массив). Каждое сообщение будет распечатываться по одной строке за раз. Если у меня будет время, я думаю, что собираюсь изменить способ обработки сообщений об ошибках в Devise, чтобы делать это во всем моем приложении, поскольку гораздо удобнее иметь одну систему сообщений об ошибках вместо двух.источник
Я решил это аналогично YoyoS, создав
app/helpers/devise_helper.rb
и поместив в него следующее:Работал!
источник
Я просто хочу принести сюда новый кусочек:
Итак, я нашел более простой способ получить результат, который хотел «AnApprentice».
Прежде всего, если вы хотите настроить что-либо в подключаемом модуле Devise, я настоятельно рекомендую вам скопировать код из "\ Ruby_repertory \ lib \ ruby \ gems \ 1.9.1 \ gems \ devise-version \ app \ controllers". | helpers | mailers ... "в файл, который вы хотите включить в свой проект.
[Edit] Или вы можете сделать свой файл наследованием от "обычных" файлов devise ... Например ... скажем ... Вы хотите перезаписать только одну функцию в devise / registrations_controller.rb, первой строке вашего пользовательского файла. Контроллер регистрации будет:
[Редактировать 7 августа 2013 г.] Теперь Devise даже предоставляет инструмент для создания контроллеров: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
Итак ... в любом случае ... Мне удалось получить то, что хотел AnApprentice, просто написав это (более чистое решение см. В следующем большом редактировании):
И, на мой взгляд, очень хорошо работали следующие строки:
Что ж ... тогда вы можете получить доступ к ошибкам для определенного атрибута, например:
И ... Небольшой трюк, чтобы отображалась только одна ошибка (первая обнаруженная) для каждого атрибута:
Я знаю, что этот вопрос был опубликован некоторое время, но я думаю, что он поможет многим пользователям изобретать :).
Большое редактирование:
Поскольку я люблю расширять свой код, делая его чище и делиться им с другими, я недавно захотел изменить файл devise_error_messages! , чтобы использовать его в своих представлениях и отображать трюк, который я объяснил выше.
Итак, вот мой метод:
Здесь нет ничего страшного, я повторно использовал код, который написал в моем представлении, чтобы показать только один атрибут ошибки pey, потому что часто первый из них является единственным актуальным (например, когда пользователь забывает одно обязательное поле).
Я считаю эти "уникальные" ошибки и делаю заголовок H2 HTML, используя множественное число и помещаю его ПЕРЕД списком ошибок.
Итак, теперь я могу использовать "devise_error_messages!" по умолчанию, и он отображает именно то, что я уже делал раньше.
Если вы хотите получить доступ к конкретному сообщению об ошибке в вашем представлении, я рекомендую использовать напрямую "resource.errors [: attribute] .first" или что-то еще.
Сея, Кульгар.
источник
Я использую Devise в Rails 3, и ваш флэш-код практически идентичен тому, что есть у меня. В моем приложении код работает должным образом; т.е. сообщения об ошибках Devise выводятся вместе с остальными моими флэш-сообщениями:
Попробуйте использовать этот точный код и посмотрите, имеет ли он какое-либо значение - может помочь другой атрибут ID.
источник
Я подошел к этому, и пока это работает. Это добавляет во флеш-память сообщения о разработке, так что ее можно использовать как обычно. Учтите, что я новичок в Ruby и Rails ...
Редактировать:
Извините, я был на посту охраны, и было какое-то нежелательное поведение. Поскольку
after_filter
вызывается после рендеринга, он работает не так, как ожидалось. Если кто-то знает, как вызвать метод после действия, но до рендеринга ...Но вместо этого вы можете использовать что-то вроде этого:
В
views/shared/_messages.html.erb
источник
Если вы хотите иметь возможность отображать более одной вспышки определенного типа (: alert,: notice и т. Д.) И не тратить время на попытки изменить поведение драгоценного камня, это решение, которое я использовал с Devise. Я почти уверен, что его можно использовать с любым драгоценным камнем, который использует флеш-сообщения.
Первым делом добавьте в свой application_controller.rb следующее:
Второе, что нужно сделать, отобразить ваши флэш-сообщения с этим в application.html.erb (или где угодно):
В-третьих, когда вы хотите добавить флэш-сообщение в любой контроллер, сделайте следующее:
источник
Создать DeviseHelper:
На ваш взгляд, заменить
Для того, чтобы:
источник
По общему признанию, немного хакерский, но я использую этот помощник (app / helpers / devise_helper.rb), чтобы захватывать вспышки и использовать их, если установлено, а затем по умолчанию
resource.errors
. Это просто основано на помощнике, который находится в devise lib.источник
Если вы хотите использовать devise_error_messages вместе с devise_error_messages, вы можете это сделать, добавив в resource.errors
Если бы вы перебрали контроллер регистрации, это могло бы выглядеть так:
источник
Очень простой способ отобразить сообщение об ошибке для каждого поля
поместите для каждого поля имя поля в квадратные скобки под каждой строкой, где вы хотите отображать встроенное сообщение об ошибке.
источник
Чтобы показать ошибку вашего устройства с вашего контроллера с появлением только первой ошибки.
источник
Просто чтобы добавить к ответу Эрика Ху выше, где используются все операторы If, вместо этого сделайте что-то вроде этого.
источник
Я просто делаю это, у меня сработало: в app / helpers / я создаю файл devise_helper.rb
во всех файлах просмотра я меняю
для:
для меня это сделать в моем представлении редактирования и нового пользователя:
надеюсь, это поможет вам;)
источник
<%= devise_error_messages! %>
и не отвечает на вопрос. Вопрос спрашивает, как применить флеш к каждому сообщению.источник
Мне нравится делать это так же, как это делается в другом контроллере Devise с этим читом.
источник
Чтобы Materialisecss отображал сообщения об ошибках разработки в виде тоста, я добавил этот код в app / helpers / devise_helper.rb
Я уверен, что это был бы самый чистый способ написать это, но он отлично работает
источник
DeviseHelper#devise_error_messages!
устарела и будет удалена в следующей основной версии.Devise теперь
devise/shared/error_messages
по умолчанию использует частичное отображение сообщений об ошибках и упрощает их настройку. Обновите свои представления, изменив звонки с:чтобы:
источник
Я просто создал
app/helpers/devise_helper.rb
похожего на Джона, но переопределил такой метод:При этом мне больше ничего не нужно изменять. Это плохая идея? Я новичок в рельсах, не стесняйтесь поправлять меня. Спасибо.
источник
Я только что объявил devise_error_messages! как пустой помощник. И вручную получил и обработал ошибки в общем партиале _errors для моего приложения. Казалось, что это самое простое решение, и мне не нужно просматривать все файлы devise и удалять вызов обработчика ошибок.
источник