Look Back - 振り返る サブスク管理 -

![look back (600 x 300 px)のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/9f76c007-820e-5906-4341-cfb6d7cbb05d.png)
作成したオリジナルアプリについて紹介します。
READMEは[こちら](https://github.com/28niwa2108/look-back)

# READMEに記載がない項目一覧
下記からジャンプできます。

[2.制作背景](#制作背景)
　[きっかけ](#きっかけ)
　[解決策](#解決策)
　[どうしてその仕組にしたのか](#どうしてその仕組にしたのか)
[3.アプリテーマ](#アプリテーマ)
[7.工夫したこと](#工夫したこと)
　(GIF画像を追加し、解説をしています)
[8.学んだこと](#学んだこと感想)
　[技術編](#技術編)
　[マインド編](#マインド編)
[9.Q&A](#qa)
　[簡単な振り返りに意味があるのか？](#簡単な振り返りに意味があるのか)
　[カリキュラム外で取り入れたものは何か](#カリキュラム外で取り入れたものは何か)

# 全体の目次
[1.アプリ概要](#アプリ概要)
[2.制作背景](#制作背景)
　[きっかけ](#きっかけ)
　[解決策](#解決策)
　[どうしてその仕組にしたのか](#どうしてその仕組にしたのか)
[3.アプリテーマ](#アプリテーマ)
[4.設計](#設計)
　[画面遷移図](#画面遷移図)
　[DB設計](#db設計)
[5.機能一覧](#機能一覧)
[6.各機能の紹介](#各機能の紹介)
　[ユーザー登録機能](#ユーザー登録機能)
　[ログイン機能](#ログイン機能)
　[ログアウト機能](#ログアウト機能)
　[ユーザー編集機能](#ユーザー編集機能)
　[ユーザー削除機能](#ユーザー削除機能)
　[サブスク登録機能](#サブスク登録機能)
　[サブスク編集機能](#サブスク編集機能)
　[サブスク削除機能](#サブスク削除機能)
　[サブスク一覧表示機能](#サブスク一覧表示機能)
　[サブスク詳細表示機能](#サブスク詳細表示機能)
　[サブスク更新機能](#サブスク更新機能)
　[サブスク評価機能](#サブスク評価機能)
　[サブスク評価一覧表示機能](#サブスク評価一覧表示機能)
　[サブスク評価詳細表示機能](#サブスク評価詳細表示機能)
　[サブスク評価編集機能](#サブスク評価編集機能)
　[サブスク未評価一覧表示機能](#サブスク未評価一覧表示機能)
　[サブスク解約機能](#サブスク解約機能)
　[解約サブスク一覧表示機能](#解約サブスク一覧表示機能)
　[解約サブスク詳細表示機能](#解約サブスク詳細表示機能)
[7.工夫したこと](#工夫したこと)
[8.学んだこと](#学んだこと感想)
　[技術編](#技術編)
　[マインド編](#マインド編)
[9.Q&A](#qa)
　[簡単な振り返りに意味があるのか？](#簡単な振り返りに意味があるのか)
　[カリキュラム外で取り入れたものは何か](#カリキュラム外で取り入れたものは何か)



# アプリ概要
小さな行動につなげるための、サブスク管理アプリです。
このアプリでできることは、以下の通りです。

+ サブスク情報の一括管理
+ 累計金額・契約期間等、サブスク情報の閲覧
+ 活用度の振り返り・アクションプラン設定
[![Image from Gyazo](https://i.gyazo.com/0eda3935761b54259610e4c2dda8339b.png)](https://gyazo.com/0eda3935761b54259610e4c2dda8339b)

# 制作背景
### きっかけ
自身のサブスク活用に課題を感じていたことがきっかけです。
課題に感じていたことは、以下の2つです。

+ サブスクには金額に見合った価値があるが、自己投資としては損益が出ている。
+ 一括10万円の買い物の前は悩むのに、毎月1000円のサブスクは気軽に支払っている。

### 解決策
+ アクションプランの設定をする

自己投資の利益である「自己成長・現状改善という結果」を出すために、
サブスクから得た情報を実際に活用する必要がある。
そのために、行動につながる「アクションプラン」の設定を義務化する。

+ 振り返りを習慣化する

コンテンツの良し悪しに加え、「どれくらい活用できたか」という活用度を意識することで、
自己投資金額を釣り合いが取れているか判断する様になる。
そのために、活用度の振り返りを習慣化する。

### どうしてその仕組にしたのか
+ プログラミング学習を通して、実践なくして習得・成長はないと再認識したから。
+ 毎日の学習終了後、振り返り記入している際に、ハッと気づきを得る経験を何度もした為。

# アプリテーマ
このアプリが目指すのは、「小さな行動につなげる」ことです。
具体的には、情報を閲覧するといった受け身な活用法から、
得た情報で行動するという実践的な活用法につなげます。
[![Image from Gyazo](https://i.gyazo.com/427012d08ac06dbe418b8f8cee1a3f3c.png)](https://gyazo.com/427012d08ac06dbe418b8f8cee1a3f3c)


# 設計
### 画面遷移図
[![Image from Gyazo](https://i.gyazo.com/9d686a286054fef9abbaa3f39d8b831c.png)](https://gyazo.com/9d686a286054fef9abbaa3f39d8b831c)


### DB設計
[![Image from Gyazo](https://i.gyazo.com/08ae366ae3bad47dc1baa54211e9e34d.png)](https://gyazo.com/08ae366ae3bad47dc1baa54211e9e34d)

## users
| Column             | Type   | Options                   |
|--------------------|--------|---------------------------|
| email              | string | null: false, unique: true |
| encrypted_password | string | null: false               |
| nickname           | string | null: false               |

### Association
+ has_many :subscriptions
+ has_many :reviews
<br>

## subscriptions
| Column             | Type       | Options                        |
|--------------------|------------|--------------------------------|
| name               | string     | null: false                    |
| price              | integer    | null: false                    |
| contract_date      | date       | null: false                    |
| update_type_id     | integer    | null: false                    |
| update_cycle       | integer    | null: false                    |
| update_day_type_id | integer    |                                |
| user               | references | null: false, foreign_key: true |

### Association
+ belongs_to :user
+ has_many :reviews
+ has_one :contract_renewal
+ has_one :contract_cancel
<br>

## contract_renewals
| Column           | Type       | Options                        |
|------------------|------------|--------------------------------|
| renewal_count    | integer    | null: false                    |
| total_price      | integer    | null: false                    |
| total_period     | integer    | null: false                    |
| update_date      | date       | null: false                    |
| next_update_date | date       | null: false                    |
| subscription     | references | null: false, foreign_key: true |

### Association
+ belongs_to :subscription
<br>

## contract_cancels
| Column         | Type       | Options                        |
|----------------|------------|--------------------------------|
| cancel_date    | date       | null: false                    |
| reason_id      | integer    | null: false                    |
| cancel_comment | text       |                                |
| subscription   | references | null: false, foreign_key: true |

### Association
+ belongs_to :subscription
<br>

## reviews
| Column         | Type       | Options                        |
|----------------|------------|--------------------------------|
| review_rate    | integer    |                                |
| review_comment | text       |                                |
| start_date     | date       | null: false                    |
| end_date       | date       | null: false                    |
| later_check_id | integer    | null: false                    |
| user           | references | null: false, foreign_key: true |
| subscription   | references | null: false, foreign_key: true |

### Association
+ belongs_to :user
+ belongs_to :subscription
+ has_one :action_plan
<br>

## action_plans
| Column                | Type       | Options                        |
|-----------------------|------------|--------------------------------|
| action_rate           | integer    |                                |
| action_review_comment | text       |                                |
| action_plan           | text       |                                |
| review                | references | null: false, foreign_key: true |

### Association
+ belongs_to :review



# 機能一覧
現在実装済の機能は、下記の通りです。
[![Image from Gyazo](https://i.gyazo.com/af01cbd8840f2a95e26a5d9b8dcc9b0b.png)](https://gyazo.com/af01cbd8840f2a95e26a5d9b8dcc9b0b)


# 各機能の紹介
## ユーザー登録機能
[![Image from Gyazo](https://i.gyazo.com/e4c31b1f276d5ca93d582bf084590b36.gif)](https://gyazo.com/e4c31b1f276d5ca93d582bf084590b36)

+ トップページで、sign upをクリック
+ 必要事項を入力し、Createをクリック
<br>

## ログイン機能
+ ヘッダーのLoginをクリック
+ 必要事項を入力し、Loginをクリック
<br>

## ログアウト機能
+ ヘッダーのLogoutをクリック
<br>

## ユーザー編集機能
[![Image from Gyazo](https://i.gyazo.com/6e2ee34df37020a270082d4e631b057e.gif)](https://gyazo.com/6e2ee34df37020a270082d4e631b057e)

+ マイページで、Settingをクリック
+ 編集したい項目を修正し、現在のパスワードを入力
+ 更新するをクリック
<br>

## ユーザー削除機能
[![Image from Gyazo](https://i.gyazo.com/543964c2222214ecc8401a8addedb190.gif)](https://gyazo.com/543964c2222214ecc8401a8addedb190)

+ マイページで、Settingをクリック
+ 退会はこちらからをクリック
+ 退会しますをクリック
<br>

## サブスク登録機能
[![Image from Gyazo](https://i.gyazo.com/295f8517208ba5dd4d0d2a3194c669b6.gif)](https://gyazo.com/295f8517208ba5dd4d0d2a3194c669b6)

+ マイページで、Addをクリック
+ 必要事項を入力・選択し、登録するをクリック
<br>

## サブスク編集機能
[![Image from Gyazo](https://i.gyazo.com/337856d1349270bf7256c259deef0d27.gif)](https://gyazo.com/337856d1349270bf7256c259deef0d27)

+ マイページで、サブスクのハンバーガーメニューをクリック
+ メニューから、編集をクリック
+ 必要事項を入力・選択し、更新するをクリック
+ 確認ホップアップが表示されるので、OKをクリック
+ 更新完了のホップアップが表示されるので、OKをクリック
<br>

## サブスク削除機能
[![Image from Gyazo](https://i.gyazo.com/828413e1db5968bdb095fa7ae7995361.gif)](https://gyazo.com/828413e1db5968bdb095fa7ae7995361)

+ マイページで、サブスクのハンバーガーメニューをクリック
+ メニューから、削除をクリック
+ 確認ホップアップが表示されるので、OKをクリック
+ 削除完了のホップアップが表示されるので、OKをクリック
<br>

## サブスク一覧表示機能
[![Image from Gyazo](https://i.gyazo.com/371870f47d6d04aff7b3a90661f57dca.png)](https://gyazo.com/371870f47d6d04aff7b3a90661f57dca)

+ マイページトップ(Listsタブ)で、契約中のサブスク一覧が確認できる
<br>

## サブスク詳細表示機能
[![Image from Gyazo](https://i.gyazo.com/fdf88dab4895e4958d1d71ddc7cda437.gif)](https://gyazo.com/fdf88dab4895e4958d1d71ddc7cda437)

+ マイページで、サブスクのカードをクリック
+ サブスク情報を確認できる
<br>

## サブスク更新機能
[![Image from Gyazo](https://i.gyazo.com/a388aeb55b759029b0dc3ccecf553ae4.gif)](https://gyazo.com/a388aeb55b759029b0dc3ccecf553ae4)

+ サブスク更新日になると、通知アイコンが表示される
+ 次回更新日がClickで更新に変化する
+ Clickで更新をクリック
+ 更新完了後、振り返りを促すホップアップが表示されるので、Goをクリック
<br>

[![Image from Gyazo](https://i.gyazo.com/3a26bf91480dfc07a49ccf7ce049d922.png)](https://gyazo.com/3a26bf91480dfc07a49ccf7ce049d922)

+ 更新完了後のホップアップで、後で振り返るをクリックし、後で振り返ることも可能
<br>

## サブスク評価機能
[![Image from Gyazo](https://i.gyazo.com/be824e4fdaed1fbc7c5124f262990728.gif)](https://gyazo.com/be824e4fdaed1fbc7c5124f262990728)

+ サブスク更新後に表示される画面に、必要事項を入力する
+ レビューをクリック
<br>

[![Image from Gyazo](https://i.gyazo.com/16fd7f4c93498d68b4aeca4a6077cd1e.gif)](https://gyazo.com/16fd7f4c93498d68b4aeca4a6077cd1e)

+ 後で振り返るをONにすると、現在の入力を一時保存できる
<br>

## サブスク評価一覧表示機能
[![Image from Gyazo](https://i.gyazo.com/ae690605373fa767773fe33081877418.gif)](https://gyazo.com/ae690605373fa767773fe33081877418)

+ マイページで、サブスクのカードをクリック
+ Reviewのもっと見る→をクリック
+ 過去のレビュー 一覧が確認できる
<br>

## サブスク評価詳細表示機能
[![Image from Gyazo](https://i.gyazo.com/b8bdead730ce15e99769f8ee95126a88.gif)](https://gyazo.com/b8bdead730ce15e99769f8ee95126a88)

+ マイページで、サブスクのカードをクリック
+ Reviewのもっと見る→をクリック
+ 閲覧したいレビューのカードのLook More→をクリック
+ 入力したレビューの詳細を確認できる
<br>

## サブスク評価編集機能
[![Image from Gyazo](https://i.gyazo.com/1a23fd0b73168212ca8febea8169dcef.gif)](https://gyazo.com/1a23fd0b73168212ca8febea8169dcef)

+ マイページで、サブスクのカードをクリック
+ Reviewのもっと見る→をクリック
+ 閲覧したいレビューのカードのLook More→をクリック
+ Editをクリック
+ 必要事項を入力して、レビューをクリック
<br>

## サブスク未評価一覧表示機能
[![Image from Gyazo](https://i.gyazo.com/93c491d63a12cc4efe8491f0f1d700cc.png)](https://gyazo.com/93c491d63a12cc4efe8491f0f1d700cc)

+ マイページで、Reviewsタブをクリック
+ 後で振り返るをONにしているレビュー 一覧を確認できる
<br>

## サブスク解約機能
[![Image from Gyazo](https://i.gyazo.com/059109baa76c6104b59683a86f2ceeaf.gif)](https://gyazo.com/059109baa76c6104b59683a86f2ceeaf)

+ マイページで、サブスクのハンバーガーメニューをクリック
+ メニューから、解約をクリック
+ 必要事項を入力・選択し、解約するをクリック
<br>

## 解約サブスク一覧表示機能
[![Image from Gyazo](https://i.gyazo.com/4f8ff2438192f624db7d1893dd805cf9.png)](https://gyazo.com/4f8ff2438192f624db7d1893dd805cf9)

+ マイページで、Cancelsタブをクリック
+ 解約済のサブスク一覧を確認できる
<br>

## 解約サブスク詳細表示機能
[![Image from Gyazo](https://i.gyazo.com/d714df7f13ff7e951bd53556c73e3041.gif)](https://gyazo.com/d714df7f13ff7e951bd53556c73e3041)

+ マイページで、Cancelsタブをクリック
+ 閲覧したいサブスクカードをクリック
+ サブスク詳細ページに解約理由が表示される


# 工夫したこと
+ 行動につながるアプリ設計をした
    + サブスク管理機能に振り返り機能を加え、サブスクの活用を保証する設計にした
    + 振り返り項目でアクションプランを必須にし、行動を促す仕様にした
    + ☆評価で手軽な評価を実現し、振り返りを継続するハードルを下げる仕様にした

+ 実際のサブスクに対応できるように、契約プランを充実させた
  - 年、月、日のタイプを選択可能
  - 年、月の場合は、「1日はじまりか否か」も選択可能
![d75552402e281a5df0f7221b32eaf791.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/18829c15-1755-31ae-5aa7-8ca4c6be18e8.gif)

+ サブスク登録時、契約開始日が過去の場合にも対応した
  - 昔から登録しているサブスクも、過去期間を含めた累計金額・契約期間を計上する
 
+ 利用しやすいUIを心がけて設計した
  + レスポンシブ対応にした
  ![3852559fe31027e1c9485e8ee1108bb4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/919bb824-5019-640d-ba4e-612613ab9e1b.gif)

 + 削除前に確認アラートを表示し、誤操作によるデータ消失を防止した。
 ![828413e1db5968bdb095fa7ae7995361.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/75ae975c-400e-5d26-7efc-ef5bc67a1f27.gif)


  + 更新待ちのサブスクには通知アイコンを付け、目立たせた
  ![aa4ce9d65fa60d8ebaadfd96ffe0ca94.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/1019ac8a-fa82-8ce9-4030-17d1e5bcce2a.gif)

  + 感覚的な操作ができるように、アイコン、hoverイベントを使用
  [![Image from Gyazo](https://i.gyazo.com/dbf0d31bf477ce295029498430d5970a.png)](https://gyazo.com/dbf0d31bf477ce295029498430d5970a)
　　　　![20a2b39d8d5c0d8a0a8cae13435339e6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/9d041a84-7e21-edc2-d808-f88eb1ae6b0d.gif)


  + サブスク登録時、自動で当日の日付が入る(カレンダー選択不要)
  - ハンバーガーメニューから、ワンクリックで編集・削除・解約操作ができる
  ![ac73fb640ab41f2cc7f974971c8284e9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/4dcb6f2d-1bda-46dc-4611-cb63e5cc291e.gif)
  - 後で振り返る機能を利用し、内容の一時保存ができる
  ![e86cfbe5fb4daa3477821c78561dae80.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257482/9f2e439c-eb8e-03e4-6a38-a2ee77ccb681.gif)

  - 複数のサブスクで「後で振り返るレビュー」が存在しても、未評価一覧から処理できる
 
+ 気づきを得るきっかけを得られるように、様々な角度の情報を表示した
  - サブスク契約金額だけでなく、累計金額・期間を表示
  - 解約理由・コメントを残すことで、過去の判断・価値観を見返す事が可能
  - 平均評価も表示することで、ロングスパン視点も持つことができる

+ 実際の開発を意識したアプリケーション作成を心がけた
    + プルリクエストでWhat, Whyを記述
[![Image from Gyazo](https://i.gyazo.com/c479da61920af7c3c9cb0f68adb1f1cc.png)](https://gyazo.com/c479da61920af7c3c9cb0f68adb1f1cc)
    + プルリクエスト前に、単体テスト・RuboCopの実行
    + 要件定義、画面遷移図を作成後実装開始
    [![Image from Gyazo](https://i.gyazo.com/093d2dfddbe289dd57efddac14ed9138.png)](https://gyazo.com/093d2dfddbe289dd57efddac14ed9138)
    + **446** exampleの単体、結合テスト実装
    [![Image from Gyazo](https://i.gyazo.com/d7a85cb894671306b38675c7b91b9dea.png)](https://gyazo.com/d7a85cb894671306b38675c7b91b9dea)

+ ユーザーニーズを知るため、フィードバックを受けれるようにした
    + [googleフォーム](https://forms.gle/CCViuSznVTG7o5cN8)リンクを追加


# 学んだこと・感想
### 技術編
+ 問題を解くことと、問題を解決することの違い

仕様通りのアプリを実装するのは、問題を「解く」ことであり、
オリジナルアプリを要件定義から行うことは、問題を「解決する」ことだと感じました。

課題通りのアプリの作成中に、
エラー解消に取り組んだり、実装方法に悩むことも勿論ございました。

しかし、
どの方法を使うのが最適か？
この方法で問題が解決出来るか？
バリデーションに漏れはないか？と、
「どうやって」といった方法から検証することは、
プログラミング知識プラス、
言語化する能力や、論理的思考力などが必要だと実感しました。

また、足りないが故に、失敗・修正を繰り返しましたが、
工夫する余地の大きさは「やりがい」に、
難しさは「できたときに充実感」に変換されました。

エンジニアの仕事の本質は、
相手の問題を解決したり、ニーズを満たすことだと思います。
そのため、プログラミング知識をしっかりつけながら、
問題解決ができるエンジニアを目指していきたいと思いました。

+ デザインの持つ力

ユーザーが利用しやすいアプリケーションを実現するには、
デザインが必須だと学びました。

具体的には、[Qiitaの記事「なぜエンジニアが作る画面はダサいのか…?「理由」と「対策」を徹底解説【エンジニア向け画面デザイン講座】」](https://qiita.com/mskmiki/items/544149987475719e417b)や、
ノンデザイナーズ・デザインブックの挿絵を見て、
デザインの四原則を適応することで、印象がガラッと変わる視覚的体験をし、
デザインのもつ力・奥深さに衝撃を受けました。

同じ情報が表示されていても、デザインによって、
情報の理解しやすさが変わることを体感し、デザインの重要さを学びました。

また、上記を参考にマイページのビューを作り変えた一例が下記です。
[![Image from Gyazo](https://i.gyazo.com/22645d9f81b60308f3668b7ea6eec4ba.png)](https://gyazo.com/22645d9f81b60308f3668b7ea6eec4ba)


### マインド編
+ 自身の壁とうまく付き合う方法

オリジナルアプリ実装に当たり、何度も実力不足を感じるタイミングがございました。
その際、建設的に考えるために次のように捉えるようにしました。


・実力不足だと感じるのは、今の自分にとって難しいと感じることに「挑戦中」である。 
・レベルが低いと感じるなら、それだけ「伸びしろ」があり、想像もできない様な成長が可能である。

知識・実力不足を受け入れながら、
前向きな捉え方もすることで、
継続的な学習モチベーションの維持になったと考えています。

+ 本心の確認

自身のキャリアと現状、なぜプログラミングなのか、と
転職を考える前に自問し、自分なりに答えを出した上で、学習を開始しました。

しかし、それが口だけでないかどうか、
プログラミングを都合の良い魔法の道具や逃げ場にしていないかは、
「行動」で確かめるのが良いと考えていました。

実際アプリ実装中に、何度も失敗し、力不足を感じながらも、
「作り上げたい、作ってみたい」「できる事が増えて楽しい」と感じていました。
プロトタイプを完成まで、簡単に諦めない・逃げなかったことから、
「エンジニア転職をする」と決めたのは意志であり、本心であったと感じました。

学習をすることと、仕事にすることは、勿論異なりますが、
半年間仕事と両立しながら学習を進めたこと、
オリジナルアプリを制作したこと、
アウトプットとしてブログを投稿したこと、
メンター質問を200問以上利用したことなど、
行動ができた＝中途半端な気持ちではないと、自身では思っております。


# Q&A
### 簡単な振り返りに意味があるのか？
2つの理由から、「意味がある」と考えています。

+ 気づきにつながる
作業としては☆を選択するだけでも、
どのくらいアクションしたか？を☆数で評価するには、
「何か行動しただろうか」「いつ」「どのくらい」など、自然と振り返る思考が生まれます。
振り返ることで、「意外と行動はできなかったな...」など、気付きにつながるからです。

+ 行動につながる
アクションプランの設定は必須にしているため、
次回更新日までに「何をするか」を決めることになります。
行動を誘発することで、成長につながると考えています。

### カリキュラム外で取り入れたものは何か
+ AWS(EC2, Route53, ACM) 
    + カリキュラムでは意識しなかったインフラを手を動かして学ぶため
+ Capistrano 
    + デプロイ作業を効率化し、コマンド実行時のミスを防止するため
+ tailwindcss
    + フロント実装スピードを上げるため
+ sweetalert2
    + アラートデザインを変更するため
+ rary
    + ☆評価を行うため
+ canva
    + トップページに表示するロゴを作成するため