Не пытайтесь отображать сообщение об ошибке при попытке аутентификации?

Я ожидал флеш-уведомления, когда при сбое аутентификации возникают ошибки. Но ничего не получите во время сбоя аутентификации, просто страница обновляется и остается неподвижной. Я ничего не менял. Сама установка по умолчанию не отображает ошибки флэш-памяти с недопустимой попыткой аутентификации. Я только что установил изобретатель, как драгоценный камень, который пытался его подправить. Din't даже изменить слово генерируемого кода.
Может быть, я думал, если это связано с некоторыми проблемами сопоставимости браузеров.
Но я получаю другие запущенные во флеш-флэш-мессенджеры.

Любые предложения относительно того, что может быть нарушено.

Я использую rails 3.0.1
* Обновление *

Я получаю сообщения об ошибках для регистрации пользователя (зарегистрируйтесь), но не для сбоев сообщений о входе в систему. некоторые googleing по этой теме показали, что для регистрации он ожидает: -
<% = devise_error_messages! % > Но для входа в него ожидается, что какой-либо другой тег предупреждающего сообщения будет указан, но не получил точной информации о том, что это тег предупреждения, который я должен использовать и использовать для использования.

Пожалуйста, предоставьте несколько предложений!!! Спасибо заранее.

Ответы

Ответ 1

Atlast после некоторого хорошего поиска/просмотра я нашел ответ,
вы должны добавить следующий фрагмент кода в наш файл application.html.erb

  <%- flash.each do |name, msg| -%>
    <%= content_tag :div, msg, :id => "flash_#{name}" if msg.is_a?(String) %>
  <%- end -%>  

После добавления этого сообщения я смог увидеть предупреждения об ошибках sign_in:).

Ответ 2

Допустимо, немного взломано, но я использую этот помощник (app/helpers/devise_helper.rb), чтобы захватить вспышки и использовать те, которые установлены, а затем по умолчанию - resource.errors. Это просто основано на помощнике, который в разработке 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

Ответ 3

Я знаю, что это старо, но я оказался здесь, потому что у меня была такая же проблема в рельсах 5.1, и принятый ответ не сработал, так что вот что я сделал. После переопределения Devise:: SessionController добавьте к нему следующий код:

after_action :unauthenticated

protected

def unauthenticated
  flash[:alert] = t("devise.failure.#{request.env['warden'].message}") unless request.env['warden'].message.blank?
end

Кроме того, на том же контроллере скопируйте и вставьте код для метода создания из своей версии Devise и удалите ! из warden.authenticate!. Поскольку вы удалили !, теперь вы должны проверить, нет ли ресурса, и перенаправить, если это так. В моем случае метод create завершился следующим образом:

def create
  self.resource = warden.authenticate(auth_options)
  redirect_to root_path and return if resource.nil?
  set_flash_message!(:notice, :signed_in)
  sign_in(resource_name, resource)
  yield resource if block_given?
  respond_with resource, location: after_sign_in_path_for(resource)
end

Наконец, вам просто нужно распечатать флэш-сообщения на ваших представлениях. Я использую материализацию, поэтому я создал частичный и добавил к нему следующий код (который вы должны настроить для своих нужд):

<% flash.each do |type, message| %>
  <% if type == "notice" %>
    <script id="toast">
      $(function() {
        Materialize.toast('<%= message %>', 4000);
      });
    </script>
  <% elsif type == "success" %>
    <script id="toast">
      $(function() {
        Materialize.toast('<%= message %>', 4000, 'green');
      });
    </script>
  <% elsif type == "alert" %>
    <script id="toast">
      $(function() {
        Materialize.toast('<%= message %>', 4000, 'orange');
      });
    </script>
  <% end %>
<% end %>