flashを使ってメッセージ表示を簡素化する。

flashを使ってメッセージ表示を簡素化する。の説明画像
目次

操作結果の表示をスマートに

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.nowrender するときに使う

例えば、さっきのユーザー登録の例で、バリデーションエラー時に 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している場合などに利用する箇所には有効

まとめると、
flashredirect_toする場合に使う
flash.nowrenderする場合に使う

実際に導入してみたら便利すぎた件

実際にプロジェクトで flash を導入したら、以下のようなメリットがありました。

✅ 操作結果やエラーメッセージがスマートに表示できる
✅ シンプルなので、コードの保守性が保たれる
✅ ユーザー体験が向上する

例えば、ログインや登録処理で「成功!」「失敗…」のメッセージをサクッと表示できるので、

ユーザーにとって分かりやすいUI を作れるのが強みですね。

まとめ

  • flash はリダイレクト後のメッセージに使う
  • flash.nowrenderなど、その処理内のみでメッセージを利用したいときに使う
  • レイアウトファイルに flash.each を書いておくと便利

これであなたも flash マスター!

Railsの開発で、ぜひ flash を活用してみてください🚀