Why a Rails flash message is shown twice

Updated . Posted . Visible to the public.

You set a flash message and it shows up as it should. However, it is displayed again the next time you follow a link. Here is why:

You have to differentiate between a render and a redirect_to because a flash message is only deleted after a redirect. If you want a message to be seen in the next request after a redirect, use flash[]. If you want a message to be seen in the current request, use flash.now[].

Workaround for the lazy

If you cannot be bothered to decide which flash hash to use, or if the flash is set by a piece of code outside your control, you can also change your layout displaying the flash so it deletes the flash message once displayed:

- flash.slice(:notice, :message, :error, :success, :warning, :failure).each do |level, value|
  - if value.present?
    %div{:class => "flash #{h level}"}
      = h value
      - flash[level] = nil # set to nil in case the flash was set without a following redirect
Profile picture of Dominik Schöler
Dominik Schöler
Last edit
License
Source code in this card is licensed under the MIT License.
Posted by Dominik Schöler to makandra dev (2011-04-28 10:20)