毎日SEの技術ブログ

平日は社内SE、休みは自宅でサービス開発するSEの技術ブログ

Rails flashの挙動

flashとは

  • 主にユーザに通知などを行う際に利用する
  • session機能を利用した機能
  • Hash形式

flashの使い方

controllerなどでflashに値を設定して、viewでflashから値を取得します。

#controller
flash[:error] = "エラーが発生しました"
#view
<%= flash[:error] %>

flashの値保持について

flashは通常次のリクエストまで保持され、その次のリクエスト時には破棄されます。

#controller
flash[:error] = "エラーが発生しました"
redirect_to 'hoge'
#hoge
<%= flash[:error] %>

この後更にリクエストを投げるときにはflash[:error]は存在しません。便利ですね。

しかし次のリクエストまで存在する為に、意識しておかないといけない点があります。

#controller
flash[:error] = "エラーが発生しました"
render action: 'hoge'
#hoge
<%= flash[:error] %>

このように処理すると次のリクエストが発生するのは画面表示された後になります。
直感的にはredirect_toと同じで一度表示したら破棄、のようなイメージになりますが、renderだとリクエストが発生しないため、redirect_toよりもワンテンポ寿命が長く感じられます。

例えばflashの内容を動的に取得してアラートを出すような処理をしていた場合、実際にアラートを出したい瞬間と、その次のリクエストとの二回アラートが出ることとなります。

renderなどリクエストが発生しないタイミングでflashを利用する際は設定時にflash.nowを使います。

#controller
flash.now[:error] = "エラーが発生しました"
render action: 'hoge'

flash.nowは現在のレスポンスだけで有効なため、次のリクエスト時には値が消えます。

逆にredirect_toするときにflash.nowを使用すると、リクエストが発生してしまうため値が取得できません。