Comment puis-je désactiver tous les messages flash de Devise gem ("connecté avec succès", "vous êtes déconnecté")? Merci.
La façon la plus simple de le faire est probablement de
Dans votre fichier devise.en.yml
, spécifiez chaque message comme vide:
en:
errors:
messages:
not_found: ''
already_confirmed: ''
not_locked: ''
etc. Ensuite, dans votre mise en page, vérifiez la présence de chaînes flash vierges avant de les générer.
<% flash.each do |key, value| %>
<%= content_tag :div, value, :class => "flash #{key}" unless value.blank? %>
<% end %>
Une réponse qui me convenait mieux était de remplacer le contrôleur de session Devise comme ceci
class SessionsController < Devise::SessionsController
# POST /resource/sign_in
def create
super
flash.delete(:notice)
end
# DELETE /resource/sign_out
def destroy
super
flash.delete(:notice)
end
end
Cela remplace en toute sécurité la méthode create and destroy qui supprime le message flash
J'ai pu les désactiver dans un contrôleur donné en surchargeant is_flashing_format?
:
def is_flashing_format?
false
end
J'utilise Devise 3.5.6
Ce travail pour moi:
# app/controllers/users/sessions_controller.rb
class Users::SessionsController < Devise::SessionsController
after_action :remove_notice, only: [:destroy, :create]
private
def remove_notice
flash.discard(:notice) #http://api.rubyonrails.org/v5.1/classes/ActionDispatch/Flash/FlashHash.html#method-i-discard
end
end
# add this line in 'config/routes.rb'
devise_for :users, :controllers => { sessions: 'users/sessions' }
J'utilise Users::SessionsController
mais vous pouvez utiliser SessionsController
, je n'ai qu'un seul modèle dans cet exemple.
J'utilise flash.discard(:notice)
mais vous pouvez utiliser flash.discard
pour supprimer d'autres types en même temps. (la méthode rejetée existe depuis Rails 3.0)
Je préfère cette approche, car ce n'est pas le rôle de la vue de vérifier si votre message flash est vide. Si vous avez un message flash, imprimez-le! Si vous ne voulez pas, alors ne créez pas de message flash ;-)
Pour Rails 5.0.6, ce code fonctionnera.
app/controllers/sessions_controller.rb
class SessionsController < Devise::SessionsController
def new
flash.clear
super
end
end
Ne pas oublier les itinéraires.
config/routes.rb
devise_for :users, controllers: { sessions: 'sessions' }