実務未経験者がRailsで予約管理アプリを作成しました!(simple_calendar)


<h2>アプリ概要</h2>

ヘッドスパスクールの授業を予約するアプリを作成しました。
イメージとしては美容室などの予約アプリのようなシステムです。

まず教師側が授業可能な日程を登録し、その日程の中から生徒が日程を選択し、授業を予約するという使い方です。

https://jsmc-machido.com/

https://github.com/keiino0425/JSMCreserveapp


<h2>作成背景</h2>
プログラミングの学習を進めていたところ、知人がヘッドスパスクールを始めたいという話をしていたので必要なシステムがないかヒアリングしたところ、予約を管理するシステムが必要とのことだったので作りました。

<h2>使用イメージ</h2>

<h3>講師側</h3>
講師用のマイページで仮予約や予約を確認できます。また、仮予約は確定もしくは削除すると生徒にメールが自動送信されます。

![スクリーンショット 2023-01-17 0.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/2685fe76-b529-174c-6658-affc91b27bd0.png)
講師の日程管理画面です。授業を入れても大丈夫な時間は◯にして、生徒からの予約を可能にします。

![スクリーンショット 2023-01-17 0.00.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/e153ff87-af91-eb6c-e9f1-bdc8a776bb55.png)

<h3>生徒側</h3>
生徒用のマイページで、仮予約や予約を確認することができます。仮予約や予約はキャンセルできますが、前日の18時以降はキャンセル不可となっています。（予約確認の入れ違い防止のため）キャンセルすると講師にメールが自動送信されます。

![スクリーンショット 2023-01-16 23.58.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/48c1141b-fedd-e7a7-64d8-aa36d81547a1.png)
授業を担当してもらう講師を選択します。

![スクリーンショット 2023-01-16 23.59.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/3ca819fe-75c0-a3b6-78c9-bb73451490d3.png)
講師の予定を元に授業の時間を選択します。選択すると、仮予約が確定し講師へメールが自動送信されます。

![スクリーンショット 2023-01-16 23.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/22e66082-1251-ffdc-8fa2-8a7f6d78b68b.png)


<h2>機能一覧</h2>
<table>
 <thead>
  <tr>
   <th></th>
   <th>機能</th>
   <th>Gem</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td>①</td>
   <td>ログイン機能</td>
   <td>devise,carrierwave</td>
  </tr>
  <tr>
   <td>②</td>
   <td>マイページ機能</td>
   <td></td>
  </tr>
  <tr>
   <td>③</td>
   <td>仮予約機能</td>
   <td>simple_calendar</td>
  </tr>
  <tr>
   <td>④</td>
   <td>自動メール送信機能</td>
   <td></td>
  </tr>
  <tr>
   <td>⑤</td>
   <td>予約機能</td>
   <td></td>
  </tr>
 </tbody>
</table>

<h2>使用技術</h2>
<h3>フロントエンド</h3>
HTML/CSS<br>
jQuery
<h3>バックエンド</h3>
Ruby 2.7.5<br>
Ruby on Rails 6.1.6.1
<h3>インフラ</h3>
mySQL<br>
Docker<br>
Heroku<br>
AWS(S3)<br>
CircleCI
<h3>ER図</h3>

![JSMC予約アプリ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/120e492e-6a9f-599d-b680-514e085bd9d0.png)



<h2>工夫した点</h2>
<h3>講師が手軽に予定を入れられるようにした点</h3>
元々は開始時間と終了時間の両方を記入して講師の予定を登録するスタイルでしたが、終日で登録できると嬉しいのではないかと思いました。
日付をクリックするとその日の終日の予定が◯(予約可能)になります。

![終日機能.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573775/5a81b3ae-50e3-13f3-df54-0b62791dcbf3.gif)

<h3>生徒側の予約可否の表示をシンプルにした点</h3>
バリデーションを利用することで<br>
①当日以前の予約は不可<br>
②同じ生徒の予約と予約の間は1週間空ける(カリキュラムの理解度を高めてもらうために自習の期間を取りたいから)<br>
は元々設定していたのですが、カリキュラムの時間(90分)が取れない場合にも◯が表示されていたため、◯が表示されないようにしました。


<h2>苦労した点</h2>
<h3>見やすいデザイン</h3>
デザインに関しては<a src="https://template-party.com/">templateparty</a>さんのデザインを使用させていただきました。

こちらを利用した理由は
①デザインを凝る時間が足りなかったから
②派手さや目新しいデザインよりもシンプルで使いやすい、機能性を重視したデザインにするべきだと思ったから
の2点です。

ですが少し殺風景で寂しい雰囲気なので改良の余地があるかなと思います...

<h3>simple_calendarのアレンジ</h3>
simple_calendarというgemを使用してカレンダー機能を作成したのですが、アレンジしながら必要な機能を作っていくのが難しかったです。
ですが、gemをなんとなく使うのではなく仕組みを理解して使いこなすことが大切だと学ぶことができ、どんな機能をつけようか考えるのも楽しく、いい経験になりました。

<h2>今後やりたいこと</h2>
vue.jsもしくはnuxt.jsの導入<br>
AWSへの移行<br>

テストの導入(Rspec)
<br>

<b>Rspecは導入しました！</b>
<a href="https://leanpub.com/everydayrailsrspec-jp">Everyday Rails</a>を参考に単体テスト、統合テストを作成しました！


<h2>感想</h2>
まず、とても楽しかったです！
自分が作ったシステムを使う人のことを考えながら、こんな機能が必要かもしれないと試行錯誤していくことで色々と勉強になりました。
開発期間が2ヶ月程度だったため、使用する技術の取捨選択や自分の技術力の拙さから実装できない部分もありましたが、今後も学習を怠らずより良いサービスを作っていきたいと思います！

他にも作ってみたいサービスのネタがあるので勉強を進めながら作っていきたいと思います！

<h2>主に参考にしたサイト</h2>

https://www.youtube.com/watch?v=lZD1MIHwMBY&t=7547s

https://qiita.com/sssssatou/items/2e6606e3ddf9b246a0fb

https://railsguides.jp/action_mailer_basics.html

https://pikawaka.com/rails/carrierwave