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

## はじめに
RUNTEQへ入学して2ヶ月の学習者です。何かあった際、コメントもらえると助かります！
## 1.なぜこの記事を作ろうと思ったか
何気なく使っていたが、flashが何なのかと疑問に思った、flashの中身が気になった為。
## 2.環境
- ruby 3.2.2
- Rails 7.1.2
## 3.フラッシュメッセージとは
リクエスト毎にクリアされる仕組みがある。使用しているユーザーへ向けて、何かアクション後、一時的にメッセージを表示させたい時に使用する。一時的に表示させるというのが重要。
## 4.前準備
以下のように作成。コードを見やすく、シンプルにしたくて最低限のものを記述。
```ruby:マイグレーションファイル
class CreateUsers < ActiveRecord::Migration[7.1]
  def change
    create_table :users do |t|
      t.string :name, null: false

      t.timestamps
    end
  end
end
```
```ruby:route.rb
Rails.application.routes.draw do
  resources :users, only: %i[index new create]
end
```
```ruby:user.rb
class User < ApplicationRecord
  validates :name, presence: true
end
```
```ruby: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
```
```erb:view/users/index.html.erb
<h1>ユーザー一覧</h1>
<% @users.each do |user| %>
  <p><%= user.name %></p>
<% end %>
<%= link_to 'ユーザー作成へ', new_user_path %>
```
```erb: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 %>
```
実際の画面
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627896/d3138b64-d163-1c70-f6cf-8c0d186ddf00.png">
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627896/fc1b70b4-a6e3-7079-42b3-32ce048ac7d0.png">
これで前準備は終了です。
## 5.フラッシュメッセージ導入
下記のコードを追加しました。
```erb:view/layouts/application.html.erb
<% flash.each do |message_type, message| %>
 <%= message %>
<% end %>
```
`<%= yield %>`の上に追加。
```ruby: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
```
これでユーザーを作成すると
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627896/20d565af-e85f-f0e7-d4e8-ba73e0c07b09.png"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627896/d47beae1-3434-8397-3c64-37b81cb0f14c.png">
成功と失敗、両方でフラッシュメッセージが表示されました。
## 6.コードを見る
### flashの中身について
```erb:view/layouts/application.html.erb
<% flash.each do |message_type, message| %>
 <%= message %>
<% end %>
```
フラッシュメッセージを表示する為のコードです。このコードを見て、なぜ`flash`メソッドへ`each`メソッドを使ってメッセージを取り出せるのかと疑問に思いました。`debug`メソッドを使用してflashの確認をしてみます。
```erb:view/layouts/application.html.erb
 <%= debug flash %> # 追加
 <% flash.each do |message_type, message| %>
  <%= message %>
 <% end %>
```
この状態でユーザーを作成すると
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627896/ce28b4cf-4eeb-138e-36ca-ac565a34ed01.png">
となっていることが分かりました。
### flashとflash.nowの使い分け
`flash`は次のリクエストで表示する。`flash.now`は現在のリクエストで表示する。
なので`flash`は`redirect_to`を使用する場合、`flash.now`は`render`を使用する場合に使用したい。

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