操作結果の表示をスマートに
Railsで「処理が成功しました!」とか「エラーが発生しました…」みたいなメッセージを表示したいとき、どうしていますか?
flash を使えば、スマートにリダイレクト後のメッセージを管理できます。
この記事では、flash の基本から flash.now との違い・活用方法を記します。
flashを使えばメッセージ管理がとっても楽に!
flash を使うと、リダイレクト後にメッセージを表示できます。例えば、こんな感じで実装します👇  
flashを使ったシンプルな成功メッセージ
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      flash[:notice] = "ユーザー登録が完了しました!"
      redirect_to @user
    else
      flash[:alert] = "登録に失敗しました…"
      render :new
    end
  end
end
このコードでは、ユーザー登録が成功すれば flash[:notice] にメッセージをセットし、失敗したら flash[:alert] にエラーメッセージをセットしています。
redirect_to すると、次のページでメッセージが表示されるのがポイントです。  
ビューでの表示方法
flash のメッセージは application.html.erb などのレイアウトファイルに書いておくと便利!  
<% flash.each do |key, message| %>
  <div class="flash <%= key %>">
    <%= message %>
  </div>
<% end %>
こうしておくと、どのページでも flash のメッセージが出せるようになります!  
flash.nowとは?flashとの違いを理解する
flash には flash.now という似たような機能があります。
違いを簡単に説明すると…  
- 
メッセージの持続時間
- 
flashは次のリクエストまでメッセージが残る
 - 
flash.nowは即時表示され、リダイレクトすると消える
 
 - 
 - 
よく使うケース
- 
flashはリダイレクト時のメッセージに使う
 - 
flash.nowはrenderするときに使う
 
 - 
 
例えば、さっきのユーザー登録の例で、バリデーションエラー時に flash.now を使うとこんな感じ👇  
** flash.nowを使ったエラーメッセージの表示**
class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      flash[:notice] = "ユーザー登録が完了しました!"
      redirect_to @user
    else
      flash.now[:alert] = "登録に失敗しました…"
      render :new
    end
  end
end
この違い、わかりますでしょうか?
- 
flash[:alert]では、リダイレクト先のページでもメッセージが残るので、redirect_toとかで 処理されている箇所には有効 - 
flash.now[:alert]だと、該当アクション内でしか適用されない(リダイレクト先には保持されない)ため、ページ遷移せずにその処理内でrenderしている場合などに利用する箇所には有効 
まとめると、
flash : redirect_toする場合に使う
flash.now : renderする場合に使う
実際に導入してみたら便利すぎた件
実際にプロジェクトで flash を導入したら、以下のようなメリットがありました。
✅ 操作結果やエラーメッセージがスマートに表示できる
✅ シンプルなので、コードの保守性が保たれる
✅ ユーザー体験が向上する
例えば、ログインや登録処理で「成功!」「失敗…」のメッセージをサクッと表示できるので、
ユーザーにとって分かりやすいUI を作れるのが強みですね。  
まとめ
- 
flashはリダイレクト後のメッセージに使う
 - 
flash.nowはrenderなど、その処理内のみでメッセージを利用したいときに使う
 - レイアウトファイルに 
flash.eachを書いておくと便利
 
これであなたも flash マスター!
Railsの開発で、ぜひ flash を活用してみてください🚀