操作結果の表示をスマートに
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 を活用してみてください🚀