🦏
予約システム 予約する時にメニュー選択できるようにして、マイページに内容を確認できるようにする。
次のポートフォリオで、
ホームページにトリミング側予約、動物病院側予約を実装できるようにしたい。
その時に、トリミングだったら、どんなメニューで予約を取りたいのか
チェックボタンかラジオボタンで選択できるようにしたいので、
練習でやってみた!
マイグレーションファイルの作成
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