рельсы - разработка - обработка - devise_error_messages - PullRequest
122 голосов
/ 05 ноября 2010

на моей странице редактирования пользователя есть строка:

<%= devise_error_messages! %>

Проблема в том, что стандартные ошибки не выводятся ошибками, как в остальных приложениях:

<% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
<% end %>

Мой вопрос: как мне заставить сообщение об ошибке устройства работать так же, как и другие, использующие flash.each?

Спасибо.

Ответы [ 20 ]

2 голосов
/ 08 октября 2013

Очень простой способ отобразить сообщение об ошибке для каждого поля

<%= resource.errors.messages[:email].join(" ") %>

поставить для каждого поля с именем поля в квадратных скобках под каждой строкой, где вы хотите отобразить встроенное сообщение об ошибке.

2 голосов
/ 30 ноября 2011

По общему признанию, немного хакерский, но я использую этот помощник (app / helpers / devise_helper.rb), чтобы захватывать вспышки и использовать их, если установлено, то по умолчанию resource.errors.Это просто на основе помощника, который находится в devise lib.

module DeviseHelper

  def devise_error_messages!
    flash_alerts = []
    error_key = 'errors.messages.not_saved'

    if !flash.empty?
      flash_alerts.push(flash[:error]) if flash[:error]
      flash_alerts.push(flash[:alert]) if flash[:alert]
      flash_alerts.push(flash[:notice]) if flash[:notice]
      error_key = 'devise.failure.invalid'
    end

    return "" if resource.errors.empty? && flash_alerts.empty?
    errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages

    messages = errors.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t(error_key, :count    => errors.count,
                                 :resource => resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end

end
2 голосов
/ 21 октября 2012

Если вы хотите получить выгоду от devise_error_messages, то можете сделать это, добавив к resource.errors

Если вы перегрузите контроллер регистрации, это может выглядеть как

def create
  if validation_or_other_check_passes
    super
  else
    build_resource
    clean_up_passwords(resource)
    resource.errors.add(:notice, "The check failed.")
    render :new 
1 голос
/ 13 октября 2011

Чтобы показать ошибку вашего устройства от вашего контроллера, когда отображается только первая ошибка.

1 голос
/ 21 января 2012

Просто чтобы добавить к Эрику Ху ответ выше, где используются все операторы If, вместо этого сделайте что-то подобное.

# Controller
flash.now[:error] = flash[:error].to_a.concat(resource.errors.full_messages)

# View
<% flash.each do |name, msg| %>
 <% Array(msg).uniq.each do |message| %>
  <%= message %>
 <% end %>
<% end %>
0 голосов
/ 22 февраля 2018

Чтобы materialisecss отображал сообщения об ошибках в виде тоста, я добавил этот код в app / helpers / devise_helper.rb

module DeviseHelper
  def devise_error_messages!

    messages = resource.errors.full_messages.map { |msg|
      String.new(" M.toast({html: '" + msg + "' }); ".html_safe )
    }.join

    messages = ("<script>" + messages + "</script>").html_safe
  end 
end

Я уверен, что это был бы самый чистый способ написать это, но оно прекрасно просыпается

0 голосов
/ 17 июля 2015

Мне нравится делать это так же, как это делается в другом контроллере Devise с этим читом.

<% if flash.count > 0 %>
  <div id="error_explanation">
    <h2>Errors prevented you from logging in</h2>
      <ul>
        <% flash.each do |name, msg| %>
        <li>
          <%= content_tag :div, msg, id: "flash_#{name}" %>
        </li>
       <% end %>
     </ul>
   </div>
<% end %>
0 голосов
/ 18 ноября 2013

Я только что создал app/helpers/devise_helper.rb, как Джон, но переопределил метод следующим образом:

module DeviseHelper
  def devise_error_messages!
    flash[:error] = resource.errors.full_messages.join('<br />')
    return ''
  end
end

С этим мне не нужно ничего менять. Это плохая идея? Я новичок в рельсах, не стесняйтесь поправлять меня. Спасибо.

0 голосов
/ 19 июля 2013

Я только что объявил devise_error_messages!как пустой помощник.И вручную извлекал и обрабатывал ошибки в общей части _errors для моего приложения.Похоже, самое простое решение, и мне не нужно просматривать все файлы устройства и удалять вызов обработчика ошибок.

0 голосов
/ 03 августа 2012
  1. Удалите "devise_error_messages!"из шаблона "app / views / users / passwords / new".
  2. Создайте пользовательский контроллер для вашего пользователя (app / controllers / users / passwords_controller.rb) и в фильтре после добавления добавьте флэш-массив ошибок:
class Users::PasswordsController < Devise::PasswordsController
  after_filter :flash_errors

  def flash_errors
    unless resource.errors.empty?
      flash[:error] = resource.errors.full_messages.join(", ")
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...