Selectively turning off Devise's flash notices

2019-03-14 10:21发布

问题:

The Devise authentication framework uses flash notices everywhere. This makes it easy to integrate with apps but it leads to poor user experience sometimes.

I am wondering what's an easy way to selectively turn off some of the Devise flash notices in my Rails 3 app. In particular, I'd like to get rid of the blatantly obvious signed_in and signed_out flashes.

Some searching suggested subclassing the session controller or use something like this but I haven't been able to find any simple solutions to this problem.

回答1:

You can customize your devise flash messages with I18n backend which devise supports. If you set nothing for particular key, the empty flash message won't be shown, for example for sign_in and sign_out:

en:
  devise:
    failure:
      unauthenticated: 'You need to sign in or sign up before continuing.'
      unconfirmed: 'You have to confirm your account before continuing.'
      locked: 'Your account is locked.'
      invalid: 'Invalid email or password.'
      invalid_token: 'Invalid authentication token.'
      timeout: 'Your session expired, please sign in again to continue.'
      inactive: 'Your account was not activated yet.'
    sessions:
      signed_in: ""
      signed_out: ""

UPD.

You should not remove the key otherwise you will get an error. To not display empty flash messages you should do simple check in the view (for ex. with haml):

- unless notice.blank? && alert.blank?
  #flash
    .wrapper
      - unless notice.blank?
        %p.notice= notice
      - unless alert.blank?
        %p.alert= alert


回答2:

A better way to hide empty flash messages: if your message is in a div with class "notice" or "error" CSS3 lets you have a style like this:

.notice:empty {
  display: none;
}

Which is nice because you can then always display the flash div and it'll only show up when there's something there. I use this to update flash messages in responses from ajax calls which otherwise wouldn't update flash messages because there's no page re-load involved. It gives a consistent look to messages that come as a result of ajax calls.