0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rails でつくる fullcalendar

Last updated at Posted at 2021-11-06

fullcalendar を実装することにした

上の記事参考にさせていただく

結果的にはこんなふう

Image from Gyazo

神社の参拝した日付と詳細がラベルになっている
それぞれラベルの部分を選択すると詳細にいく

開発環境

ruby 2.6.5
Ruby on Rails 5.2.5

前提

日付の入ったテーブルがある

本題

まずは

Gemfile
gem 'fullcalendar-rails'
gem 'momentjs-rails'

bundle install

application.js
//= require jquery/dist/jquery.js
//= require moment 
//= require fullcalendar 

で読み込む。jqueryyarn でインストールしてあるのそっちを指定した

js ファイルは

js
$(function () {
  // 画面遷移を検知
  $(document).on('turbolinks:load', function () {
      if ($('#calendar').length) {

          function Calendar() {
              return $('#calendar').fullCalendar({
              });
          }
          function clearCalendar() {
              $('#calendar').html('');
          }

          $(document).on('turbolinks:load', function () {
              Calendar();
          });
          $(document).on('turbolinks:before-cache', clearCalendar);

          //events: '/events.json', 以下に追加
          $('#calendar').fullCalendar({
              events: '/worships/calendar.json',
              //カレンダー上部を年月で表示させる
              
              titleFormat: 'YYYY年 M月',
              //曜日を日本語表示
              dayNamesShort: ['日', '月', '火', '水', '木', '金', '土'],
              //ボタンのレイアウト
              header: {
                  left: '',
                  center: 'title',
                  right: 'today prev,next'
              },
              //終了時刻がないイベントの表示間隔
              defaultTimedEventDuration: '03:00:00',
              buttonText: {
                  prev: '前',
                  next: '次',
                  prevYear: '前年',
                  nextYear: '翌年',
                  today: '今日',
                  month: '月',
                  week: '週',
                  day: '日'
              },
              // Drag & Drop & Resize
              editable: true,
              //イベントの時間表示を24時間に
              timeFormat: "HH:mm",
              //イベントの色を変える
              eventColor: '#87cefa',
              //イベントの文字色を変える
              eventTextColor: '#000000',
              eventRender: function(event, element) {
                  element.css("font-size", "0.8em");
                  element.css("padding", "5px");
              }
          });
      }
  });
});

こう

で、Viewcalendar っていう id があれば
データは入ってないけどカレンダーが表示されるはず

しかしされない
むむむ


//= require jquery/dist/jquery.js

を消して

//= require jquery

を追記した。
すると表示される。

どうやら fullcalendar-railsrails-jquery じゃないとだめみたい
yarn のじゃだめみたい

すると無事カレンダーは表示された


つぎは rails との連携
流れとしては

フロント側からバックエンドに API みたいなのを叩いて
json 形式のファイルを要求

json の情報を元にカレンダーを表示する。

という流れ

ちなみにこの json をかえすバックエンドのファイルは jbuilder
scaffold でいつもできるやつ

いつもスルーしてたけどようやく日の目をみた


まずは

js
  //events: '/events.json', 以下に追加
          $('#calendar').fullCalendar({
              events: '/worships/calendar.json',
              //カレンダー上部を年月で表示させる
              
              titleFormat: 'YYYY年 M月',
              //曜日を日本語表示
              dayNamesShort: ['日', '月', '火', '水', '木', '金', '土'],
              //ボタンのレイアウト

上のコードの events: '/worships/calendar.json', の部分で json をかえすファイルを指定

このファイルは

calendar.json.jbuilder

json.array!(@worships) do |event|
  json.extract! event, :id
  json.title event.id
  json.start event.worship_day
  json.url worship_url(event, format: :html)
end

こんなかんじ。
これを JS 側から叩くと json 形式でデータがかえってくる

でかえってきた情報を元にカレンダーを表示する

上のコードだと

@worshils に表示したDBのインスタンス情報があって
json.title の情報がカレンダーのラベルに表示される情報

json.start っていう内容でカレンダーのどこに表示されるのかが決まる

json.url は表示された情報をクリックしたら飛ぶ URL

今回の場合だと

Image from Gyazo

こうなる


次はラベルの部分を神社名にする

参拝と神社は違うテーブルで、アソシエーションが組んであった

なので

json.array!(@worships) do |event|
  json.extract! event, :id
  json.title event.shinto.name
  json.start event.worship_day
  json.url worship_url(event, format: :html)
end

上の event.shinto.name で情報は取り出せるはずだった。

しかし

Image from Gyazo

こんなかんじで、jsonファイルが要求される度に大量のクエリが流れて
表示されるということになってしまった。

表示はされるけどあまりに遅い

どうやら @worships の中のプロパティなら問題ないのに外部キーを指定すると
すべての情報を build する仕様みたい


jbuilder のファイルを以下のようにした

json.array!(@worships) do |event|
  json.extract! event, :id
  json.title event.shinto.name if params[:start] < event.worship_day.to_s && event.worship_day.to_s < params[:end]
  json.start event.worship_day
  json.url worship_url(event, format: :html)
end

params[:start] には表示している付きの開始日が、params[:end] には終了日が入るので
後置 if で条件分岐して、必要な情報だけ引っ張るようにする

すると無事神社名がラベルに表示される

長かった。

カレンダーに表示させているラベル名と詳細のテーブルが違ったらこの記事が参考になるかもです。

0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?