ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

Deviseでログイン・ログアウト後のflashメッセージを削除する

Railsの認証ライブラリ筆頭であるDeviseはセキュアで高度な認証を肩代わりしてくれる一方、中の挙動を把握していないと扱いにハマることがしばしばあります。

Deviseはi18nに対応しており、ログイン・ログアウトなどのアクションを行った際にflash[:notice]を通してグローバル対応したメッセージを出力してくれます。

flashは「now」メソッドを使用しない限り、一度当該メッセージを表示するまでセッションに溜め込まれているので、適切なタイミングで出力しないと、おかしな場面でログインメッセージが表示されたりといったことが起こりえます。

例えばDeviseではログイン・ログアウト後にメッセージが出力されるのですが、それを停止したい場合は以下の方法があるようです。

  1. i18nファイルに空のstringを追加する
  2. Deviseのsessionコントローラーをオーバーライドする

通常は1でも問題ないでしょうが、グローバル対応するサービスではあまりスマートではありません。
そこで2の手法を紹介します。

まずSessionsControllerをオーバーライドしたカスタムコントローラーを作成します。

class HogeController < Devise::SessionsController
  # 中身はDeviseのSessionsControllerをコピペ
  # 用途に応じてカスタムする
end

そこにafter_filterとして独自メソッドを追加します。

after_filter :flash_wo_kesuyo, only: [:create, :destory]

protected
def flash_wo_kesuyo
  if flash[:notice].present?
    flash.delete(:notice)
  end
end

このようにflash[:notice]が存在した場合に削除してあげればログイン・ログアウト後にメッセージが出力されません。

Deviseは便利である一方、実運用する場合にはカスタムがほぼ必須になるので、一つのライブラリとしては学習コストが高いので要注意です。