web-dev-qa-db-fra.com

Devise/Rails - Comment supprimer un message flash particulier? (Enregistré avec succès)

En utilisant Devise, je voudrais savoir s’il existe un moyen de supprimer un message flash particulier? (Enregistré avec succès).

Les autres messages de la vue me préoccupent, c’est donc uniquement pour les utilisateurs connectés et déconnectés. Dois-je écraser le contrôleur ou existe-t-il un autre moyen?

Je vous remercie!

38
benoitr

Vous venez de définir une chaîne vide dans votre fichier local. Dans ce cas, vous ne pouvez rien voir.

58
shingara

D'accord!

Comme Shingara l'a dit, je définis une chaîne vide dans devise.en.yml

sessions:
  signed_in: ''

et je change aussi un peu la ligne suivante (fournie par nifty-generators):

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, :id => "flash" if msg.length > 0 %>
<% end %>

De cette façon, mon css n'apparaît pas.

38
benoitr

Chaîne vide dans le fichier de paramètres régionaux (comme suggéré ci-dessus), mais ajoutez également l'extrait de code CSS suivant à masquer (au lieu de vous amuser avec vos vues Flash)

.flash.alert:empty {
  display: none;
}
8
Sean Schofield

Un autre moyen flexible consiste à supprimer la notification après l'action:

class SessionsController < Devise::SessionsController
  after_action :remove_notice, only: :destroy

  private

  def remove_notice
    flash[:notice] = nil
  end
end

Avec cette solution, vous pouvez ajouter des conditions pour supprimer ou non la notification.

8
Sunny

Une autre méthode consiste à remplacer le contrôleur Devise par le code suivant dans l'action de création, ce qui supprime le message flash:

class MyDevise::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

ceci a été répondu à cette autre SO question. Pour un article de blog sur la façon de remplacer le contrôleur Devise, voir mon article de blog

4
andrewcockerham

De mon point de vue, je ne vois pas l'intérêt de vider une traduction de chaîne, car vous pouvez facilement modifier le fonctionnement du contrôleur. Je suppose que cette méthode est beaucoup plus correcte et satisfaisante.

Une meilleure réponse pourrait être de remplacer la méthode destroy dans sessionController.

Crée simplement un fichier placé dans: app/controllers/sessions_controller.rb

Comme vous pouvez le voir, nous commentons la ligne créant le message flash.

class SessionsController < Devise::SessionsController 
  # DELETE /resource/sign_out
  def destroy
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    #set_flash_message :notice, :signed_out if signed_out && is_flashing_format?
    yield if block_given?
    respond_to_on_destroy
  end
end
3
fhidalgo

Je pense que cet appareil comprend maintenant que si vous modifiez le message d'erreur dans config/locals/devise.en.yml en une chaîne vide, il l'ignorera automatiquement. Au moins c'est ce qui a fonctionné avec moi.

2
omarwaleed

Vous pouvez le faire, veuillez changer le type de condition et le type de flash en conséquence.

flash.delete (: alert) if flash [: alert] == ​​"Vous devez vous connecter ou vous inscrire pour continuer." @drivers = params [: mot clé] .blank? ? []: Driver.find (params [: mot-clé])

Vous pouvez le faire avant le filtre.

0
shiva kumar