今回はメッセージを表示するflashとflash.nowの違いについて解説したいと思います。メッセージ表示後、どのようなアクションを実行するかによって使い方が変わるので、ぜひ理解しておきましょう。
flashの概要
まずはflashの概要についておさらいしておきます。
flashとは、ログインに失敗した場合や成功した際に一時的に表示するメッセージのことです。フラッシュメッセージがあるとないとでは、大きくユーザーエクスペリエンスが変わってくるのでぜひ実装しておきましょう。

flashとflash.nowの違い
次に本題の、flashとflash.nowの違いについて見ていきましょう。結論から先に記述すると、以下の通りになります。
- flash: redirect_toと一緒に使用する
- flash.now: renderと一緒に使用する
なぜこのようになるのでしょうか?
flashは、次のアクション(動作)が終了するまでメッセージを保持します。一方でflash.nowは、次のアクション(動作)が起こった段階でメッセージを消去します。
そのため、このような使い分けになります。これがflashとflash.nowの大きな違いです。
分かりやすい図がQiitaにあったので参考として載せておきます。

参考:https://qiita.com/taraontara/items/2db82e6a0b528b06b949
flashとflash.nowの記述方法
続いて、flashとflash.nowの基本的な記述方法について見ていきます。基本的な書き方は以下の通りになります。
flash[:キー名] = "表示させたいメッセージ"
flash.now[:キー名] = "表示させたいメッセージ"
キー名では主に「notice」と「alert」を使用します。noticeは何かお知らせしたい場合に、alertは何か警告したい場合に使用します。使用例としては以下の通りです。
flash[:notice] = "お知らせです"
flash.now[:alert] = "警告です"
flashとflash.nowの使用例
では実際に、flashとflash.nowを使ってフラッシュメッセージを表示させてみましょう。
フラッシュメッセージを表示するための領域を確保
まずはフラッシュメッセージを表示するための領域を確保します。具体的には、application.html.haml(application.html.erb)にフラッシュメッセージを表示するための領域を確保します。
以下のようにapplication.html.hamlを編集しましょう。
↓ application.html.haml
# 省略
%body
- flash.each do |message_type, message|
= content_tag :div, message, class: message_type
content_tagはタグを簡単に書くことができるメソッドです。基本的な記述は以下のようになるので覚えておきましょう。
= content_tag :タグ名, "表示する文字", class: "クラス名"
これでフラッシュメッセージを表示させるための準備が整いました。
flashの場合の記述
まずはflashの場合の記述について見ていきましょう。先ほどもお伝えしましたが、flashの際はredirect_toを使用します。
↓ flashの記述例
if @user.save
redirect_to root_path
else
flash[:alert] = "ユーザー登録できませんでした"
redirect_to user_registration_path
end
redirect_to使用時は、以下のようにflashを使用せず簡略的に記述することもできます。
redirect_to root_path, notice: "登録が完了しました"
redirect_to user_registration_path, alert: "登録に失敗しました"
flash.nowの場合の記述
一方で、flash.nowの場合の記述は以下のようになります。flash.nowの際は、renderを使用することを思い出しましょう。
↓ flash.nowの記述例
if @user.save
redirect_to root_path
else
flash.now[:alert] = "ユーザー登録できませんでした"
render :new
end

まとめ
- flashとは、ログインに失敗した場合や成功した際に一時的に表示するメッセージのこと
- flashは、redirect_toと一緒に使用する
- flash.nowは、renderと一緒に使用する
- flashは次の次のアクション(動作)が起こるまでメッセージを保持し、flash.nowは次のアクション(動作)が起こった段階でメッセージを消去する
- redirect_to使用時は、flashを使用せず簡略的に記述することができる
今回はメッセージを表示するflashとflash.nowの違いについて解説しました。これらの違いを知らないと、いつまでたってもフラッシュメッセージが表示されないといったことが起きてしまうので、ぜひ理解しておきましょう。