0
0

Rails フラッシュメッセージの表示

Posted at

はじめに

RUNTEQへ入学して2ヶ月の学習者です。何かあった際、コメントもらえると助かります!

1.なぜこの記事を作ろうと思ったか

何気なく使っていたが、flashが何なのかと疑問に思った、flashの中身が気になった為。

2.環境

  • ruby 3.2.2
  • Rails 7.1.2

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

リクエスト毎にクリアされる仕組みがある。使用しているユーザーへ向けて、何かアクション後、一時的にメッセージを表示させたい時に使用する。一時的に表示させるというのが重要。

4.前準備

以下のように作成。コードを見やすく、シンプルにしたくて最低限のものを記述。

マイグレーションファイル
class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string :name, null: false

      t.timestamps
    end
  end
end
route.rb
Rails.application.routes.draw do
  resources :users, only: %i[index new create]
end
user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def new
    @user = User.new
  end

  def create
    @user = User.build(user_params)
    if @user.save
      redirect_to users_path
    else
      render :new
    end
  end

  private

  def user_params
    params.require(:user).permit(:name)
  end
end
view/users/index.html.erb
<h1>ユーザー一覧</h1>
<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>
<%= link_to 'ユーザー作成へ', new_user_path %>
view/users/new.html.erb
<h1>ユーザー作成</h1>
<%= form_with model: @user do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  <%= f.submit 'ユーザー作成' %>
<% end %>
<%= link_to 'ユーザー一覧へ', users_path %>

実際の画面


これで前準備は終了です。

5.フラッシュメッセージ導入

下記のコードを追加しました。

view/layouts/application.html.erb
<% flash.each do |message_type, message| %>
 <%= message %>
<% end %>

<%= yield %>の上に追加。

users_controller.rb
def create
 @user = User.build(user_params)
  if @user.save
   flash[:notice] = 'ユーザーを作成しました' # 追加
   redirect_to users_path
  else
   flash.now[:alert] = 'ユーザー作成に失敗しました' # 追加
   render :new, status: :unprocessable_entity # 追加 422エラー時に表示させる為
  end
end

これでユーザーを作成すると

成功と失敗、両方でフラッシュメッセージが表示されました。

6.コードを見る

flashの中身について

view/layouts/application.html.erb
<% flash.each do |message_type, message| %>
 <%= message %>
<% end %>

フラッシュメッセージを表示する為のコードです。このコードを見て、なぜflashメソッドへeachメソッドを使ってメッセージを取り出せるのかと疑問に思いました。debugメソッドを使用してflashの確認をしてみます。

view/layouts/application.html.erb
 <%= debug flash %> # 追加
 <% flash.each do |message_type, message| %>
  <%= message %>
 <% end %>

この状態でユーザーを作成すると

となっていることが分かりました。

flashとflash.nowの使い分け

flashは次のリクエストで表示する。flash.nowは現在のリクエストで表示する。
なのでflashredirect_toを使用する場合、flash.nowrenderを使用する場合に使用したい。

また何か発見次第、追記していきたい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0