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を使用すると、リクエストが発生してしまうため値が取得できません。