2009-06-19 4 views
59

J'utilise un avis flash dans une application Rails, avec le code suivant:Rails message flash reste pour deux chargements de page

flash[:notice] = "Sorry, we weren't able to log you in with those details." 
render :action => :new 

Le message flash rend comme prévu sur l'action 'nouveau', mais il montre également sur la page suivante les visites de l'utilisateur (quel qu'il soit). Cela ne devrait apparaître qu'une fois, mais quelque chose le fait rester.

Répondre

116

Il existe deux façons de résoudre ce problème. La première consiste à utiliser

flash.now[:notice] 

lorsque votre flash doit être mis au rebut à la fin de la demande actuelle et ne doit pas être utilisé après une redirection.

La seconde consiste à appeler

flash.discard(:notice) 

à la fin de la demande. Lequel est le meilleur dépend du comportement de votre application.

http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html

+1

+1, et d'expliquer davantage le comportement, le message flash standard est destiné à être conservé pour la demande « suivant ». Par exemple. vous générez un flash lors de la gestion d'une demande de création ou d'édition, puis redirigez l'utilisateur vers l'écran d'affichage. Lorsque le navigateur fait la demande suivante à l'écran d'affichage, le flash est affiché. Si vous générez réellement un flash sur l'écran d'affichage lui-même, utilisez flash.now – asc99c

+0

[La section du guide ruby ​​expliquant ce comportement] (http://guides.rubyonrails.org/action_controller_overview.html#flash-now). – br3nt

14

Ok, j'ai résolu ce problème. La façon de contourner ce problème est d'utiliser:

flash.now[:notice] = "Sorry, we weren't able to log you in with those details." 
render :action => :new 

La partie clé étant flash.now [: avis] au lieu de Flash [: avis].

Questions connexes