🦏

予約システム 予約する時にメニュー選択できるようにして、マイページに内容を確認できるようにする。

2024/08/26に公開

次のポートフォリオで、
ホームページにトリミング側予約、動物病院側予約を実装できるようにしたい。
その時に、トリミングだったら、どんなメニューで予約を取りたいのか
チェックボタンかラジオボタンで選択できるようにしたいので、
練習でやってみた!

マイグレーションファイルの作成

rails g model Menu name:string
rails g model ReservationMenu reservation:references menu:references
rails db:migrate

モデルの設定

models/reservation.rb
class Reservation < ApplicationRecord
 has_many :reservation_menus
 has_many :menus, through: :reservation/menus
end
models/menu.rb
class Menu < ApplicationRecord
  has_many :reservation_menus
  has_many :reservations, through: :reservation_menus
end
models/reservation_menu.rb
class ReservationMenu < ApplicationRecord
  belongs_to :reservation
  belongs_to :menu
end
  • 予約とメニューの関係を設定する。
    ひとつの予約に複数のメニューが紐づく形 なので
    ReservationモデルMenuモデルの間に多対多の関係を設定するのが良いので、中間テーブルを使う。

メニューの作成(シードデータ)

アプリケーションに最初からメニューがある状態にするために、シードデータを設定する。

db/seeds.rb
Menu.create([
  { name: '全身カット(大型犬)' },
  { name: '全身カット(中型犬)' },
  { name: '全身カット(小型犬)' },
  { name: 'シャンプーのみ(大型犬)' },
  { name: 'シャンプーのみ(小型犬)' },
  { name: '部分カット' }
])
rails db:seed

さっき練習で、↑をやるの忘れて、メニューが表示されなかった。
どうして反映されないか、まずデータとして入っているのかを、
rails cで、Menu.allしてみたら、空でした。笑

新規予約ページのビューに追記する

reservations/new.html.erb
        <% Menu.all.each do |menu| %>
          <div>
            <%= check_box_tag 'reservation[menu_ids][]', menu.id, @reservation.menus.include?(menu) %>
            <%= label_tag "reservation_menu_#{menu.id}", menu.name %>
          </div>
        <% end %>

予約詳細ページに追記する

resevation/show.html.erb
<div>
        <label><strong>メニュー:</strong></label>
        <% if @reservation.menus.present? %>
          <% @reservation.menus.each do |menu| %>
            <p style="display:inline"><%= menu.name %></p>
          <% end %>
        <% else %>
          <p style="display:inline">メニューが選択されていません</p>
        <% end %>
     </div>

コントローラーの設定

reservations_controller.rb
def reservation_params
  params.require(:reservation).permit(:date, :time, menu_ids: [])
end
  • 予約の作成や、更新時にメニュー情報を保存するために、ストロングパラメーターを設定する。

マイページに表示させる。

user/show.html.erb
 <h2><strong>予約一覧</strong></h2>
  <thead>
    <tr>
      <th scope="col"><i class="fa-solid fa-scissors"></i> トリミング予約日</th>
      <th scope="col">予約したメニュー</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <% @user_reservations.each do |user_reservation| %>
      <tr>
        <td>
          <strong>
            <i class="fa-regular fa-square-check"></i>
            <%= user_reservation.day %>
            <%= user_reservation.time %>
          </strong>
        </td>
        <td>
          <% if user_reservation.menus.any? %>
            <% user_reservation.menus.each do |menu| %>
              <li><%= menu.name %></li>
            <% end %>
          <% else %>
            <p>メニューが選択されていません。</p>
          <% end %>
        </td>
        <td>
          <% if user_reservation.day >= Date.today + 2.days %>
          <%= link_to 'キャンセル', reservation_path(user_reservation), method: :delete, data: { confirm: '本当にキャンセルしますか?' }, class: 'btn btn-outline-primary' %>
          <!--%= link_to 'キャンセル', cancel_reservation_path(user_reservation), method: :patch, data: { confirm: '本当にキャンセルしますか?' }, class: "btn btn-outline-primary" %>-->
          <% else %>
            <p>2日前を過ぎたため、キャンセルは電話でのみ受け付けています。</p>
          <% end %>
        </td>
      </tr>
    <% end %>
  </tbody>
  • マイページの予約一覧

  • 予約詳細ページ

  • 新規予約のメニュー選択ページ

次は、メニュー選択したら、予約するsimple_calendarの枠が自動的に"X"になるようにしたいなぁとか。

Discussion