はじめに
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
は現在のリクエストで表示する。
なのでflash
はredirect_to
を使用する場合、flash.now
はrender
を使用する場合に使用したい。
また何か発見次第、追記していきたい。