🐈

【Rails】フラッシュメッセージ

2023/11/11に公開

今更感もありますが、覚えの良くない自分は毎回カリキュラムを見返しているので、カリキュラムを振り返らなくてもここを見れば思い出せるように簡単にまとめておきます。

フラッシュメッセージとは

フラッシュメッセージとは、主に投稿や登録をした後に一時的に表示されるメッセージのことです。ぱっと見で「自分の操作が成功したのか、失敗したのか」がわかるのでユーザビリティもあがります。

設定方法

  1. コントローラに記述
    まずはコントローラに成功パターンと失敗パターンを記述します。
:
def create
    @genres = Genre.all
    @menu = Menu.new(menu_params)
    @menu.genre_id = params[:menu][:genre_id]
    if @menu.save
      # メニューの新規登録が成功した場合の処理
      flash[:notice] = "登録に成功しました。"
      redirect_to admin_menu_path(@menu.id)
    else
      # メニューの新規登録が失敗した場合の処理
      flash.now[:notice] = "登録に失敗しました"
      render 'new'
    end
  end

成功パターン

saveの後、redirect_to の前にflash[:notice]を設定する。

失敗パターン

render の場合、アクションを新たに実行しないため、「flash.now」メソッドを使用

flashとflash.nowの違い
  • flashは「メッセージを設定後、次のアクションが実行完了したらメッセージを消去する」という性質を持っています。
  • flash.nowは「メッセージの設定後、現在のアクションが実行完了したらメッセージを消去する」という性質を持っています。

「redirect_to」のときは「flash」、「render」のときは「flash.now」と覚える覚えるとわかりやすいです。

  1. ビューでメッセージを表示できるように設定
    使用したいビューに毎回<%= flash[:notice] %>を記入しても可能ですが、記述の失念や毎回書くことも手間になってくるのでapplication.html.erbに記入してしまうことがお勧めです。
app/views/layouts/application.html.erb
:
:
 <main>
   <% flash.each do |message_type, message| %>
     <div class="flash-message <%= message_type %>"><%= message %></div>
   <% end %>
   <%= yield %>
 </main>
:
:

each文をを使用することでキーは :notice、取り出したキーをmessage_type、値をmessageにそれぞれ代入しているので、内容に関わらず表示できるようになります。

ここまででフラッシュメッセージを表示させるところまでは可能になります。
3. わかりやすいようにメッセージに色を付ける
app/assets/stylesheets/application.cssに色を付けるためのcssを設定します。
今回は投稿に成功した場合(flash[:notice])は文字を青く、投稿に失敗した場合(flash[:alert])は文字を赤く表示するようにします。

app/assets/stylesheets/application.css
:
:
.flash-message {
  border-radius: 5px;
  padding: 16px 24px;
  margin: 16px 0px;
}
 
.flash-message.notice {
  background-color: #bcdfff;
  color: #0067C0;
  border: solid 1px #0067C0;
}
 
.flash-message.alert {
  background-color: #ffd4d1;
  color: #930403;
  border: solid 1px #930403;
}

完成


まとめ

フラッシュメッセージには下記が必要になります。

  • コントローラからビューにメッセージを渡す"flash[:notice]"
  • ビューファイルに必要な情報を送るための、コントローラへの記述
  • フラッシュメッセージを表示させるための、ビューファイルの記述

参考

https://zenn.dev/h_hana/articles/8d1062943ad6af

Discussion