前提・実現したいこと
カレンダーを表示させたい。
発生している問題・エラーメッセージ
【Rails】 5分でFullCalendar実装する方法(下記URL)を試した。
https://qiita.com/imotan/items/c73fab5ee230114a08b6
Eventを作成、編集、削除させる機能は実装できたが、肝心のカレンダーを出すことができない。
該当のソースコード
Rails のバージョンは6.0.0を指定
scaffold で Eventモデルを作成しました。
ターミナル
// Rails アプリケーション作成 $ rails _5.2.4.2_ new five_min_fullcalendar $ cd five_min_fullcalendar // scaffold で Event モデルを作成 $ rails g scaffold event title:string body:string start_date:datetime end_date:datetime $ rails db:migrate RAILS_ENV=development
GemFile へ3つのgemを追加してbundle install
GemFile
1gem 'jquery-rails' 2gem 'fullcalendar-rails' 3gem 'momentjs-rails'
fullcalendar の部分を追加
app/assets/stylesheets/application.css
1*= require_tree . 2 *= require_self 3 *= require fullcalendar 4 */
fullcalendar の部分を追加
app/javascript/packs/application.js
1// This file is automatically compiled by Webpack, along with any other files 2// present in this directory. You're encouraged to place your actual application logic in 3// a relevant structure within app/javascript and only use these pack files to reference 4// that code so it'll be compiled. 5 6require("@rails/ujs").start() 7require("turbolinks").start() 8require("@rails/activestorage").start() 9require("channels") 10 11 12// Uncomment to copy all static images under ../images to the output folder and reference 13// them with the image_pack_tag helper in views (e.g <%= image_pack_tag 'rails.png' %>) 14// or the `imagePath` JavaScript helper below. 15// 16// const images = require.context('../images', true) 17// const imagePath = (name) => images(name, true) 18//= require jquery 19//= require moment 20//= require fullcalendar 21 22$(function () { 23 // 画面遷移を検知 24 $(document).on('turbolinks:load', function () { 25 if ($('#calendar').length) { 26 27 function Calendar() { 28 return $('#calendar').fullCalendar({ 29 }); 30 } 31 function clearCalendar() { 32 $('#calendar').html(''); 33 } 34 35 $(document).on('turbolinks:load', function () { 36 Calendar(); 37 }); 38 $(document).on('turbolinks:before-cache', clearCalendar); 39 40 //events: '/events.json', 以下に追加 41 $('#calendar').fullCalendar({ 42 events: '/events.json', 43 //カレンダー上部を年月で表示させる 44 titleFormat: 'YYYY年 M月', 45 //曜日を日本語表示 46 dayNamesShort: ['日', '月', '火', '水', '木', '金', '土'], 47 //ボタンのレイアウト 48 header: { 49 left: '', 50 center: 'title', 51 right: 'today prev,next' 52 }, 53 //終了時刻がないイベントの表示間隔 54 defaultTimedEventDuration: '03:00:00', 55 buttonText: { 56 prev: '前', 57 next: '次', 58 prevYear: '前年', 59 nextYear: '翌年', 60 today: '今日', 61 month: '月', 62 week: '週', 63 day: '日' 64 }, 65 // Drag & Drop & Resize 66 editable: true, 67 //イベントの時間表示を24時間に 68 timeFormat: "HH:mm", 69 //イベントの色を変える 70 eventColor: '#87cefa', 71 //イベントの文字色を変える 72 eventTextColor: '#000000', 73 eventRender: function(event, element) { 74 element.css("font-size", "0.8em"); 75 element.css("padding", "5px"); 76 } 77 }); 78 } 79 }); 80});
JSONファイルを作成して、FullCalendarのライブラリへそのJSONファイルを渡す
app/views/events/index.json.jbuilder
1# json.array! @events, partial: "events/event", as: :event 2json.array!(@events) do |event| 3 json.extract! event, :id, :title, :body 4 json.start event.start_date 5 json.end event.end_date 6 json.url event_url(event, format: :html) 7end
id が calendar の div 要素を一番下に追加
app/views/events/index.html.erb
1<p id="notice"><%= notice %></p> 2 3<h1>Events</h1> 4 5<table> 6 <thead> 7 <tr> 8 <th>Title</th> 9 <th>Body</th> 10 <th>Start date</th> 11 <th>End date</th> 12 <th colspan="3"></th> 13 </tr> 14 </thead> 15 16 <tbody> 17 <% @events.each do |event| %> 18 <tr> 19 <td><%= event.title %></td> 20 <td><%= event.body %></td> 21 <td><%= event.start_date %></td> 22 <td><%= event.end_date %></td> 23 <td><%= link_to 'Show', event %></td> 24 <td><%= link_to 'Edit', edit_event_path(event) %></td> 25 <td><%= link_to 'Destroy', event, method: :delete, data: { confirm: 'Are you sure?' } %></td> 26 </tr> 27 <% end %> 28 </tbody> 29</table> 30 31<br> 32 33<%= link_to 'New Event', new_event_path %> 34 35<div id="calendar"></div>
turbolinks対策
app/views/layouts/application.html.erb
1<!DOCTYPE html> 2<html> 3 <head> 4 <title>FiveMinFullcalendar</title> 5 <%= csrf_meta_tags %> 6 <%= csp_meta_tag %> 7 <script type="text/javascript" src="https://js.pay.jp/v1/"></script> 8 <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 9 <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 10 </head> 11 12 <body data-turbolinks="false"> 13 <%= yield %> 14 </body> 15</html>
試したこと
・別のVSCode内で上手く行かなかったので、この機能だけで実装してみた
・views/layouts/apprication.html.erbにjavaを読み込むscriptを記述する
補足情報(FW/ツールのバージョンなど)
Rails 6.0.0
ruby 2.6.5
あなたの回答
tips
プレビュー