環境
Rails 5.2
Ubuntu20.4
はじめに
flashにはオプションとして、noticeとalertの2つのキーが用意されていますが、任意でnoticeとalert以外のキーを設定して、取り出して表示することもできるようになっています。
普通のやり方
標準的な使い方をする場合は、noticeとalertだけを使います。コントローラーでflashにメッセージを設定します。
flash[:alert] = "アラートです。"
flash[:notice] = "注意事項です"
redirect_to test_url
flashの変数の中身を見ると、alertとnoticeに値が正しくセットされていることが確認できます。
#<ActionDispatch::Flash::FlashHash:0x00007fb89c859f88 @discard=#<Set: {}>, @flashes={"alert"=>"アラートです。", "notice"=>"注意事項です"}, @now=nil>
alertとnoticeの内容はビューの中で次のようにして表示します。
- if flash.alert.present?
.alert.alert-danger = flash.alert
- if flash.notice.present?
.alert.alert-success = flash.notice
任意のキーを作成
flashにnotice1、notice2というキーを作成して値をセットしました。notice1、notice2というキーは、flashで標準で用意されていないキーです。
flash[:notice1] = "注意事項その1"
flash[:notice2] = "注意事項その2"
redirect_to test_url
flashの変数の中身を見ると、ちゃんとnotice1とnotice2に値がセットされていることが確認できます。
#<ActionDispatch::Flash::FlashHash:0x00007fb8a324fa00 @discard=#<Set: {}>, @flashes={"notice1"=>"注意事項その1", "notice2"=>"注意事項その2"}, @now=nil>
notice1とnotice2の内容をビューで表示させようとしたところ、1行目で次のエラーが表示されました。
undefined method 'notice1'
flashにはハッシュのnoticeキーと同じ名前のnoticeメソッドが用意されているようです。ハッシュのnotice1キーは自作したキーであるため、この名前のメソッドは標準では用意されていません。よって、notice1というメソッドは存在していませんというエラーが出てきたということです。
- if flash.notice1.present?
.alert.alert-success = flash.notice1
- if flash.notice2.present?
.alert.alert-success = flash.notice2
ハッシュのキーを指定することなく、ハッシュのセットされている値を全て表示させるには、次のようにすると表示することができます。
- flash.each do |key, value|
div.alert.alert-success
= value