TojiTech No Programming, No Life.

Rails(6系)でFullCalendarの導入からサンプルまで

注意

サンプルのリポジトリは、Dockerで起動することを前提に作成されています。
Dockerを使用しない場合は、appフォルダ以下で通常のrailsの起動処理を行ってください。

なお、記事ではDockerを使用せず導入する手順で記載していますのでご注意ください。

サンプルリポジトリ

こちららからご確認ください

Yarnでパッケージをaddする

yarn add @fullcalendar/core @fullcalendar/daygrid

JavaScriptでFullCalendarを読み込む

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
Turbolinks.start()
ActiveStorage.start()

// 以下を追加
import {Calendar} from '@fullcalendar/core';
import dayGridPlugin from '@fullcalendar/daygrid';

document.addEventListener('turbolinks:load', function () {
    const calendarEl = document.getElementById('calendar');

    const calendar = new Calendar(calendarEl, {
        plugins: [dayGridPlugin]
    });

    calendar.render();
});

コントローラーなどの設定

rails g controller plans index
Rails.application.routes.draw do
  root to: "plans#index"
end
class PlansController < ApplicationController
  def index; end
end
<h1>Plans#index</h1>
<p>Find me in app/views/plans/index.html.erb</p>

<%# 描画部分として以下を追加 %>
<div id='calendar'></div>
FullCalendarの表示

実際に予定を入れてみよう

rails g model Plan title:string start:date end:date

JavaScriptを少し変更。

// This file is automatically compiled by Webpack, along with any other files
// present in this directory. You're encouraged to place your actual application logic in
// a relevant structure within app/javascript and only use these pack files to reference
// that code so it'll be compiled.

import Rails from "@rails/ujs"
import Turbolinks from "turbolinks"
import * as ActiveStorage from "@rails/activestorage"
import "channels"

Rails.start()
Turbolinks.start()
ActiveStorage.start()

// 以下を追加
import {Calendar} from '@fullcalendar/core';
import dayGridPlugin from '@fullcalendar/daygrid';

document.addEventListener('turbolinks:load', function () {
    const calendarEl = document.getElementById('calendar');

    const calendar = new Calendar(calendarEl, {
        plugins: [dayGridPlugin],
        /*
         * 以下を追加
         * ポイントは、'コントローラー名.json'
         */
        events: '/plans.json'
    });

    calendar.render();
});

コントローラーを少し変更。

class PlansController < ApplicationController
  def index
    @plans = Plan.all
  end
end

ルーティングを少し変更。

%記法については、こちらを参照してください

Rails.application.routes.draw do
  root to: "plans#index"
  # 以下を追加
  resources 'plans', only: %w(index)
end

FullCalendarにPlanを表示するためのJSONを準備。今回は、Rails標準のjBuilderを使用します。

json.array!(@plans) do |plan|
  json.id plan.id
  json.title plan.title
  json.start plan.start
  json.end plan.end
end

Planをとりあえず、Seedで用意します。自分で登録する場合は、newやcreateを準備してください。

plans = [
  { title: 'サンプルプラン1', start: DateTime.now, end: DateTime.now },
  { title: 'サンプルプラン2', start: DateTime.now + 1, end: DateTime.now + 1 },
  { title: 'サンプルプラン3', start: DateTime.now + 2, end: DateTime.now + 2 },
  { title: 'サンプルプラン4', start: DateTime.now + 3, end: DateTime.now + 3 },
  { title: 'サンプルプラン5', start: DateTime.now + 4, end: DateTime.now + 4 },
]

plans.each do |plan|
  Plan.create(
    title: plan[:title],
    start: plan[:start],
    end: plan[:end]
  )
end
正しく読み込まれています

注意点

  • タイムゾーンの考慮はしていません
  • Rails(5系)では、別の実装方法です。

Profile

Yuki Tojima

RubyやPhp、JavaScriptまわりのことを徒然と記録に残す技術ブログです。

至らぬところもあると思いますが、見守っていただけると幸いです。

記事のリクエストや、間違いなどありましたら X (旧 Twitter) のDMなどでお気軽にご連絡ください。

ytojima @TojiTech
プロフィール画像