Придумать не отображать сообщение об ошибке во время ошибки аутентификации? - PullRequest
14 голосов
/ 06 ноября 2010

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

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

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

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

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

Ответы [ 4 ]

38 голосов
/ 27 ноября 2010

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 голосов
/ 30 ноября 2011

По общему признанию, немного хакерский, но я использую этот помощник (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
0 голосов
/ 29 августа 2018

Rails 5.1, Devise 4.4.3

Внутри формы ошибки могут отображаться с помощью:

<% resource.errors.full_messages.each do |msg| %>
    <%= msg %>
<% end %>
0 голосов
/ 13 октября 2017

Я знаю, что это старо, но я оказался здесь, потому что у меня была та же проблема с рельсами 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

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

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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...