Rails4 flashのメッセージが2回表示される

flashに設定したメッセージが2回表示されて困ったのでメモ。

下記のようにflashにalertを設定し、newを再表示していた。

flash[:alert] = "登録に失敗しました。"
render action: 'new'

登録画面で登録ボタンを押下すると、正常にメッセージが表示されたが、再度登録画面を表示すると、また同じメッセージが表示されてしまった。もう一度登録画面を表示すると、メッセージは表示されなかった。


正しくは、下記のように記載しなければいけなかったようだ。

flash.now[:alert] = "登録に失敗しました。"
render action: 'new'


flash.nowとflashでは動作が異なるようだ。

flash.now
現在のリクエストでのみ有効なメッセージを設定する。
現在のリクエストが終了した時点で、自動的にメッセージは削除される。
renderで表示する画面にメッセージを表示したい場合に用いる。

flash
次のリクエストまで有効なメッセージを設定する。
次のリクエストが終了した時点で、自動的にメッセージは削除される。
redirect_toした先の画面でメッセージを表示したい場合に用いる。


私はrenderでnewを再表示していたのに、flashを使っていたため、期待していた画面の1つ先の画面にまでメッセージが表示されていたようだ。


参考:
[Rails] flash.now[:notice]とflash[:notice]の違い - 拝啓、シーシュポス