【Ruby on rails6】simple calenderで予約機能を実装する

【Ruby on rails6】simple calenderで予約機能を実装する

今回はgemのsimple calenderを使用してカレンダーに予約を入れるシステムを作成していきます。

1.新規アプリの作成

rails new calendar

2.Gemのインストール

gem 'simple_calendar'
bundle install

3.scaffoldでテンプレートを呼び出す

rails g scaffold reservation name start_time:datetime

railsに標準で備えられているscaffoldを使用してテンプレートを呼び出して簡単なアプリケーションを作成していきます。reservationはモデル名で、そのあとはstring型のnameカラムとdatetime型のstart_timeとなっています。このコマンドを打ったあとは、いつも通りmigrateします。

rails db:migrate

ついでにrootパスを指定して、確認がしやすいようにもしていきます。

Rails.application.routes.draw do
  root to: 'reservations#index'
  resources :reservations
end

4.simple calenderのviewを作成する

rails g simple_calendar:views

このコマンドを打つとファイルが3つ作成されますが、今回はmonthを使用していきます。

カレンダーにcssを適用させるためにapplication.cssに記述をしていきます

*= require simple_calendar
 *= require_tree .
 *= require_self
 */

次にreservations/index.html.erbにカレンダーを表示させるための記述をしていきます。

<%= month_calendar events: @reservations do |date, reservations| %>
  <%= date %>

  <% reservations.each do |reservation| %>
    <div>
      <%= reservation.start_time.hour %>:<%= reservation.start_time.min %>
      <%= reservation.name %>
    </div>
  <% end %>
<% end %>

これでシンプルカレンダーの導入は完了しました。予約をするとカレンダーに予約が表示されるようにもなっています。

5.バリデーションの設定

class Reservation < ApplicationRecord
  validates :name, presence: true
  validate :date_before_start
  validate :start_time_not_sunday
  validate :start_time_not_saturday
  validate :time_only
  validates :start_time, uniqueness: { message: 'は他のユーザーが予約しています' }

  def date_before_start
    errors.add(:start_time, "は過去の日付を選択できません") if start_time < Date.today
  end

  def start_time_not_sunday
    errors.add(:start_time, "は日曜日を選択できません") if start_time.sunday?
  end

  def start_time_not_saturday
    errors.add(:start_time, "は土曜日を選択できません") if start_time.saturday?
  end

  def time_only
    if hour_only_1 && min_only
      true
    elsif hour_only_2 && min_only
      true
    else
      errors.add(:start_time, "(時間)は13:15もしくは19:15になります")
    end
  end

  def hour_only_19
    start_time.hour == 19
  end

  def hour_only_13
    start_time.hour == 13
  end

  def min_only
    start_time.min == 15
  end
end

今回設定したバリデーション

・date_before_startは今日よりも後の日しか選択できない
・start_time_not_sundayとstart_time_not_saturdayは土曜日と日曜日は選択できない
・time_onlyはこちらで指定した時間しか予約することができない
・start_time.hourとstart_time.minで予約できる時間と分の指定をしている
・start_timeがuniquenessになっているので、同じ時間に一つしか予約ができないようになっている

まとめ

今回はsimple_calenderというgemを使用して予約する機能を作成してみました。simple_calenderは結構直感的に予約の機能が実装できるため、gemの中では簡単な部類では合ったかなと思います(cssを導入するところで詰まったのは内緒)。それでは今回はこの辺で!また別の記事でお会いしましょう!

カテゴリー

naska