Railsでflashを使うことで、ユーザーに対してのメッセージを簡単に表示することができます。
この記事ではそんなflashの使い方と仕組みをまとめています。
目次
flashとは
flashとはページが切り替わった時にユーザーに対してのメッセージを簡単に表示することができるメソッド。
- flashはキーに対する値としてメッセージを設定できるハッシュのようなもの
- flashはsessionに格納される
- flashは一度表示されると、sessionから自動的に削除される
- flashの格納先であるsessionはブラウザのCookieである
- Cookieが無効になっているブラウザではflashに登録されたメッセージは表示されない
Railsのflash基本構文
flashはコントローラで登録して、ビューで表示します。
コントローラ(登録)の構文
1 2 |
flash[キー] = メッセージ 例)flash[:notice] = “ログインしました。” |
ビュー(表示)の構文
1 2 |
<% flash[キー] %> 例)<% flash[:notice] %> |
Railsのflashの仕組み
flashは登録した次のビュー(ページ)へ「遷移」したときに表示され、情報が削除される。
そのため、さらに次のビュー(ページ)に「遷移」した時には表示されません。
なぜ「遷移」を強調しているかというと、ページを「遷移」させるのは「redirect_to」を使用した場合になるからです。
「redirect_to」と同じようにページを切り替える方法として「render」があります。
ここで注意が必要なのは「render」はページを「遷移」させているのではなく、強制的にページを「表示」させているだけということです。
ですので、「render」を使用した場合は「表示」したページでflashメッセージが表示されるが、さらに次のビュー(ページ)に「遷移」した時にもflashメッセージは残ったままとなってしまいます。
以下のようなイメージ。
これだと「render」で使用する場合はflashメッセージは使い物にならないように思えます。
render使用時の問題の対策:flashメッセージを現在のページで表示する
上記のような「render」時の問題を解決をするためにはコントローラで「flash.now」を使用する。
1 2 |
flash.now[キー] = メッセージ 例)flash.now[:notice] = “ログインしました。” |
こうすることによってflashメッセージは今の表示に対して行うことになります。
以下のようなイメージです。
Railsのflash応用構文
flashの応用構文を紹介します。
flashメッセージの生存期間を1ページ分長くする:flash.keep
次ページに「遷移」した時のコントローラで「flash.keep」を使用することで、flashメッセージの生存期間を1ページ分長くできる。
1 2 |
flash.keep[キー] 例)flash.keep(キー) |
以下のようなイメージになります。
flashメッセージに埋め込まれたHTMLタグを変換して表示する:html_safe
コントローラでflashメッセージにHTMLタグを埋め込まれる場合は、ビュー側で「html_safe」を使用することでHTMタグを正常に変換して表示することができる。
1 2 |
<% flash[キー].html_safe %> 例)<% flash[:notice].html_safe %> |
注意点として、formの入力値をflashメッセージに格納して表示する場合は悪意のあるscriptを埋め込まれる可能性があるためHTMLタグの変換は行わないようにする必要があります。
まとめ
- flashメッセージはユーザーに対してのメッセージを簡単に表示するために使用する
- flashメッセージはCookieが有効でないと使用できない
- flashメッセージの生存期間は、ビュー(ページ)の「遷移」(redirect_to)1回分
- flash.keepを使用することでflashメッセージの生存期間をビュー(ページ)の「遷移」1回分延長できる
- renderはページを強制的に「表示」させているだけなのでflashメッセージは削除されない
- flashメッセージ内のHTMLタグはビュー側で「html_safe」メソッドを使用することで正常に変換することができる
- flashメッセージ内のHTMLタグを変換する場合はセキュリティに注意する