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