Не пытайтесь отображать сообщение об ошибке при попытке аутентификации?
Я ожидал флеш-уведомления, когда при сбое аутентификации возникают ошибки. Но ничего не получите во время сбоя аутентификации, просто страница обновляется и остается неподвижной.
Я ничего не менял. Сама установка по умолчанию не отображает ошибки флэш-памяти с недопустимой попыткой аутентификации. Я только что установил изобретатель, как драгоценный камень, который пытался его подправить. 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 %>