Ruby on Rails: サービス提供可能性の表示と予約リンクの動的生成
はじめに
この記事では、Ruby on Railsを使用して、特定の日に特定のサービスが提供可能かどうかを判断し、結果をユーザーに視覚的に表示する方法について解説します。さらに、サービスが提供可能な場合は、ユーザーが直接予約できるように予約ページへのリンクを動的に生成する方法も取り上げます。
シナリオ
ある会社が複数のサービスを提供しており、それぞれのサービスには複数のスタッフが割り当てられています。スタッフは日ごとに異なるスケジュールで働き、サービス提供の可否はスタッフのスケジュールと提供可能なサービスに基づいています。
実装手順
1. コントローラーの設定
まず、指定された日に働くスタッフと、15分区切りの時間枠を生成するためのコントローラーアクションを設定します。
def for_customer_index
@date = params[:date].present? ? Date.parse(params[:date]) : Date.today
@company = Company.find(params[:company_id] || viewing_company.id)
@working_staffs_on_date = @company.staffs.joins(:schedules).where(schedules: {at_work: true, date: @date}).includes(:services)
@time_slots = generate_time_slots(@company)
@service_availability = calculate_service_availability(@company, @date, @time_slots, @working_staffs_on_date)
end
2. ビューの設定
ビューファイルには、各サービスと時間帯ごとの提供可能性を表示するテーブルを設定し、○
と△
の場合には予約リンクを付与します。
<%# app/views/schedules/for_customer_index.html.erb %>
<table style="border-collapse: collapse;">
<!-- テーブルヘッダー -->
<tbody>
<% @time_slots.each do |slot| %>
<tr>
<% @company.services.each do |service| %>
<td style="text-align: center;">
<% availability = @service_availability[service.id][slot] %>
<% if availability == '○' || availability == '△' %>
<%= link_to availability, new_reservation_path(company_id: @company.id, service_id: service.id, date: @date, time_slot: slot), class: "reservation-link" %>
<% else %>
<%= availability %>
<% end %>
</td>
<% end %>
</tr>
<% end %>
</tbody>
</table>
まとめ
この方法を用いることで、ユーザーは直感的にサービスの予約可能な時間帯を確認し、提供可能な時間帯については直接リンクを通じて予約ページに進むことができます。この実装は、予約システムやリソース管理システムなど、さまざまなアプリケーションで応用可能です。