Rails

【Rails】メッセージを表示するflashとflash.nowの違いについて簡単にまとめてみた

Rails

 

今回はメッセージを表示する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にあったので参考として載せておきます。

flash

参考:https://qiita.com/taraontara/items/2db82e6a0b528b06b949

redirect_toはアクションですが、renderはビューを表示するだけでアクションではありません。

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
Rails
【Rails基礎】renderメソッドの使い方と記述方法を初心者向けに完全解説renderメソッドの使い方を初心者向けに解説しています。renderメソッドはビューをレスポンスとして返すという役割を持っていますが、ビューとコントローラーでは使い方や記述方法が異なるので、この機会におさらいしておきましょう。...

まとめ

  • flashとは、ログインに失敗した場合や成功した際に一時的に表示するメッセージのこと
  • flashは、redirect_toと一緒に使用する
  • flash.nowは、renderと一緒に使用する
  • flashは次の次のアクション(動作)が起こるまでメッセージを保持し、flash.nowは次のアクション(動作)が起こった段階でメッセージを消去する
  • redirect_to使用時は、flashを使用せず簡略的に記述することができる

 

 

今回はメッセージを表示するflashとflash.nowの違いについて解説しました。これらの違いを知らないと、いつまでたってもフラッシュメッセージが表示されないといったことが起きてしまうので、ぜひ理解しておきましょう。