web-dev-qa-db-fra.com

Rails Désactiver les messages flash

Comment puis-je désactiver tous les messages flash de Devise gem ("connecté avec succès", "vous êtes déconnecté")? Merci.

45
Marat_Galiev

La façon la plus simple de le faire est probablement de

  1. Définir chaque message comme une chaîne vide
  2. Vérifiez la longueur de la chaîne avant d'afficher un message flash.

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 %>
70
Michelle Tilley

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

32
acrogenesis

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

5
Manuel Pedrera

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 ;-)

0
djothefou

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' }

0
zhisme