LoginSignup
1
0

サービス提供可能性の表示と予約リンクの動的生成(case when構文によるビューの動的生成)

Posted at

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>

まとめ

この方法を用いることで、ユーザーは直感的にサービスの予約可能な時間帯を確認し、提供可能な時間帯については直接リンクを通じて予約ページに進むことができます。この実装は、予約システムやリソース管理システムなど、さまざまなアプリケーションで応用可能です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0