今回は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を導入するところで詰まったのは内緒)。それでは今回はこの辺で!また別の記事でお会いしましょう!