🍎

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

2023/07/24に公開

はじめに

投稿できているのかできていないのか、今の操作が成功したのか失敗だったのかをメッセージとして表示させることでユーザーが状況を把握しやすくなり、使いやすさを向上させることができる機能!

↓ 完成イメージ「成功用のメッセージ」

altテキスト

↓ 完成イメージ「失敗用のメッセージ」

altテキスト

1.コントローラーに記述(成功用のメッセージ)

下記をコントローラーの適切な場所に追記
flash[:notice] = "表示させたいメッセージ"

app/controllers/books_controller.rb
class BooksController < ApplicationController
  def new
   @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    if @book.save
      flash[:notice] = "投稿に成功しました"  ←ここに追記!
      redirect_to book_path(@book)
    else
      render :index
    end
  end
:
:
  • saveの後、redirect_to の前にflash[:notice]を設定!

2.コントローラーに記述(失敗用のメッセージver)

下記をコントローラーの適切な場所に追記
flash.now[:notice] = "表示させたいメッセージ"

app/controllers/books_controller.rb
class BooksController < ApplicationController
  def new
   @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    if @book.save
      flash[:notice] = "投稿に成功しました"
      redirect_to book_path(@book)
    else
      flash.now[:notice] = "投稿に失敗しました"    ←ここに追記!
      render :index
    end
  end
:
:
  • render の場合、アクションを新たに実行しないため、「flash.now」メソッドを使用
  • renderのあとに「flash」を使用すると、画面でリロードしてもメッセージが表示されたままになってしまう
     - flashは「メッセージを設定後、次のアクションが実行完了したらメッセージを消去する」という性質がある
     - flash.nowは「メッセージの設定後、現在のアクションが実行完了したらメッセージを消去する」という性質がある
     - 「redirect_to」のときは「flash」
     - 「render」のときは「flash.now」とセットで覚える!

3.ビューにフラッシュメッセージを表示

フラッシュメッセージを設定したいビュー全てに直接記述してもいいが、結構大変・・・・
なので、今回は app/views/layouts/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>
:
:

ここまででサーバー起動して確認!

フラッシュメッセージが表示されるようになったけど、少しわかりづらい。

↓「投稿に成功しました」
altテキスト

↓「投稿に失敗しました」
altテキスト

4.フラッシュメッセージに色をつける

「成功」「失敗」がわかりやすくなるように、メッセージを色分けします!

「成功」・・・青色
「失敗」・・・赤色
で実装します。

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;
}
app/controllers/books_controller.rb
class BooksController < ApplicationController
  def new
   @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    if @book.save
      flash[:notice] = "投稿に成功しました"
      redirect_to book_path(@book)
    else
      flash.now[:alert] = "投稿に失敗しました"    ←noticeをalertに編集
      render :index
    end
  end
:
:
  • 「notice」=青色、「alert」=赤色で表示される
  • 文字色や背景色等はCSSで変更可能

このような感じになりました!

↓「成功用のメッセージ」

altテキスト

↓「失敗用のメッセージ」

altテキスト


以上でフラッシュメッセージの実装は完了です🙋
誤りがあればコメントをいただけると幸いです🙏

Discussion