ポートフォリオとして作成中のTodoAppに期限日機能を付けていきます
Taskテーブルにdeadline:date
カラムを加える
% rails g migration AddDeadlineToTasks deadline:date
sqliteはややこしい・・
class AddDeadlineToTasks < ActiveRecord::Migration[6.0] def up add_column :tasks, :deadline, :date change_column :tasks, :deadline, :date, null: false end def down remove_column :tasks, :deadline end end
% rails db:migrate
StrongParameterに:deadline
を追加する
忘れがちなやつ
[ tasks_controller.rb ]
(省略) def task_params params.require(:task).permit(:done, :title, :description, :image, :public, :deadline) end
シードにdeadline
を追加して、`rails db:seed
する
[ db/seeds.rb ]
deadline = Date.today.next_day(2)
こんな感じに入れてみる
Viewをいじる
formにdeadline
の場所を作ってあげる
[ form.html.slim ]_
= form_with model: task, local: true do |f| (省略) = f.label :deadline, '期限日' = f.text_field :deadline, class: 'form-control' .row.justify-content-center = f.submit '登録', class: 'btn btn-success col-2'
一覧ページに表示されるようにする(適当に)
[ tasks/index.html.slim ]
= "期日:#{l private_task.deadline}"
Bootstrap Material DatePicker
やっとです!
一番簡単なdatepickerです。(がちで)
いろいろ試して失敗しまくった末に見つけたンスよ。
https://designlink.work/ja/bootstrap-material-datepicker/
こちらのサイトを見ればすぐ使えますが、説明していきます
準備は簡単
views/layouts/application.html.slim
のheader
内に上記URLの組み込みファイルとベーシックマークアップを記述するだけ。全て、CDNとして読み込まれるので、bundle
やyarn
を使う必要なしです。楽ちん
そして、使いたいページで
<input class="result" type="text" id="date-time" placeholder="Date Picker...">(例)
と書くだけ!
実際にやってみます!
私は、application.html.slim
がごちゃごちゃになるのが嫌なので_datepicker.html.slim
を作成しました。
[ layouts/_datepicker.html.slim ]
link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/css/bootstrap-material-datetimepicker.min.css" link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons" script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js" script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js" script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/locale/ja.js" script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-material-datetimepicker/2.7.1/js/bootstrap-material-datetimepicker.min.js" javascript: $(function(){ $("#date").bootstrapMaterialDatePicker({ weekStart:0, lang:"ja", time: false, format:"YYYY-MM-DD" }); });
設定について
weekStart:0
不明lang: "ja"
表記を日本語にしてくれるtime: false
日時ではなく日付のみになるformat:"YYYY-MM-DD
日付のみのフォーマット#date
はidです!viewと合わせてください。
詳しくはドキュメントを! https://designlink.work/ja/bootstrap-material-datepicker/
これをhead
内にrender
するのを忘れずに
[ layouts/application.html.slim ]
doctype html html head title | Welldone = csrf_meta_tags = csp_meta_tag = stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' = render 'layouts/datepicker' #これよ! body = render 'layouts/header' .container-md = render 'layouts/flash' = yield = render 'layouts/footer'
そして
単独で使うなら
input class="result" type="text" id="date"
でいいんですが、form
内に使いたかったので、
[ _form.html.slim ]
= form_with model: task, local: true do |f| (省略) = f.label :deadline, '期限日' = f.text_field :deadline, class: 'form-control result', id: 'date' .row.justify-content-center = f.submit '登録', class: 'btn btn-success col-2'
試しにclass: 'result'
とid: 'date'
を書いてみたら・・
見事表示されました!
選択して、okを押すと
日付のみ入力されました!
ラッキー
次回、期限日にそのまま日付を表示してもつまらない(つまらない)