【個人開発】相談する側とされる側を繰り返す、循環型相談アプリ「めぐる宝石花」を開発しました【Rails】

## はじめに 
はじめまして、kzkio([@kzkio_0114](https://x.com/kzkio_0114))と申します。

2023年10月からプログラミングスクール「RUNTEQ」に入学し、Ruby on Railsを中心に学習しています。今回は、循環型相談アプリ「[めぐる宝石花](https://www.xn--z8j3e5a2787akv3apqn.com)」をリリースしましたので、その紹介と技術的な工夫についてまとめます。

今回はQiitaで初めての記事投稿となります。至らない点もあるかもしれませんが、ぜひ温かく見守っていただけると嬉しいです。

## アプリ紹介



### **サービスURL** 


https://www.xn--z8j3e5a2787akv3apqn.com

### **GitHub URL** 

https://github.com/kzkio114/FlowerJewelRing

## サービス概要

このアプリは、**相談する側と相談される側の役割を交互に繰り返す**ことで、相談が循環する仕組みを持った相談アプリです。ユーザー同士が相談を通じて感謝の気持ちを共有し、贈り物を通じてつながりを深め、相談をより積極的に行える環境を提供します。

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

## 開発背景

### 1. **自分自身の悩みを解決するため**

私はプログラミングスクールで、病気や様々な悩みをオープンにし、深い話から軽い話まで多くの人々と相談し合える環境を作ってきました。当初は相談を受ける側でしたが、次第に自分が相談する側になることが増え、相談することへの罪悪感や、相手に負担をかけているのではないかという思いが強くなってきました。

このアプリは、**自分自身が感じていた相談に対する罪悪感や負担感を解消**し、相談する側とされる側が感謝を分かち合いながら、より健全に成長できる場を作ることを目的としています。相談を通じて得られる安心感や喜びを共有し、ポジティブなサイクルを生み出すことを目指しています。

### 2. **他のアプリとの差別化をするため**

多くの相談アプリでは、相談することが中心になりがちですが、このアプリでは**相談するだけでなく、アドバイスを提供する側にも回れる**という点が特徴です。

さらに、ユーザーが自分に合った**返信スタイルを「肯定」「普通」「否定」から選べるため、受けたい意見を選びながら安心して相談できます。また、センシティブな相談は匿名で1対1のチャット**を通じて行えるため、プライバシーも確保されています。

これにより、相談者とアドバイザーが互いに感謝を伝え合い、ポジティブな体験を積み重ねる仕組みを提供しています。

## メイン機能

### 相談投稿機能

- ユーザーは悩みを投稿し、他のユーザーからアドバイスを受けることができます。匿名での相談や、カテゴリ別の投稿も可能です。

### 返信トーン選択機能

- ユーザーは、肯定、普通、否定のトーンから選んで返信を受け取り、意見をフィルタリングして自分の希望に合った意見だけを得ることができます。

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

### 最新通知機能

- ユーザーは最新のメッセージや贈り物を最大5件を確認できます。通知をクリックすると、詳細を拡大表示できます。

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

### 感謝の贈り物機能

- 相談に感謝の気持ちを込めて、ユーザー同士で花や宝石を贈り合います。贈られたアイテムはユーザーのプロフィールに反映され、貢献度を示すものとして表示されます。

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

### リアルタイムチャット機能

- **プライベートチャット**: 名前を伏せた専用IDを使用して、1対1の暗号化された安全なチャットを行うことができます。

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

- **グループチャット**: 招待制や自由に参加できるメンバーで、リアルタイムのグループチャットが可能です。

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

## その他機能

- **ソーシャルログイン**: Google、GitHub、Discordでの認証が可能です。
[![Image from Gyazo](https://i.gyazo.com/bcf25de782c41f4a2b0e2a84bafcb505.gif)](https://gyazo.com/bcf25de782c41f4a2b0e2a84bafcb505)

- **検索機能**: 相談内容やユーザー名、キーワードでの検索が可能です。
[![Image from Gyazo](https://i.gyazo.com/d269c51d24b1aa79050150a783dee23d.gif)](https://gyazo.com/d269c51d24b1aa79050150a783dee23d)

- **ユーザー表示**: 登録ユーザーの一覧表示が可能です。
[![Image from Gyazo](https://i.gyazo.com/ea547069550ee50281b15ea8f6854c11.gif)](https://gyazo.com/ea547069550ee50281b15ea8f6854c11)
- **管理画面**: 管理者用の画面でユーザーや贈り物を管理できます。
[![Image from Gyazo](https://i.gyazo.com/940f4d4c025ba8c9a5f56f90a04818e4.gif)](https://gyazo.com/940f4d4c025ba8c9a5f56f90a04818e4)

- **X（旧Twitter）投稿機能**: 相談内容や進捗をXにシェアする機能を実装。自動でリンクやハッシュタグが付与されます。
[![Image from Gyazo](https://i.gyazo.com/480b6a1aa9ae129aec1ee7e0ba10f522.gif)](https://gyazo.com/480b6a1aa9ae129aec1ee7e0ba10f522)

## 工夫点

- **匿名投稿の安心感**: 匿名投稿時、自分が投稿した内容を把握しやすい仕組みを導入しています。
- **直感的なUX**: CSSアニメーションを活用し、ボタンのホバー時やページの切り替え時に滑らかな動きを実現。ユーザーが直感的に操作できるよう工夫しています。
- **リアルタイムチャット**: プライベートチャットとグループチャットの両方でリアルタイム通信を実現し、スムーズなやり取りが可能です。
- **贈り物のシステム**: 花言葉や宝石の意味を贈り物に反映し、感謝や励ましの気持ちをシェアできる仕組みを提供しています。
- **レスポンシブ対応**: スマートフォン向けに最適化されたデザインで、チャットや投稿機能が使いやすい設計をしています。
- **通知機能の向上**: 非同期でメッセージや贈り物の通知を確認でき、即座に詳細を確認できます。
- **高速検索**: Elasticsearchを使用した高速な検索機能を実装。匿名投稿でも「ユーザー名: 匿名」として表示され、プライバシーを保護しつつ検索結果にアクセスできます。
- **ページ遷移の効率化**: Turbo Streamsを利用して、ダッシュボード内の操作のほとんどをページ遷移なしで完了できるように設計しています。
- **日本語ドメインの取得**: 日本語のドメインを取得し、ユーザーに親しみやすいURLを実現しました。

## 画面遷移図

https://www.figma.com/design/6xguagGcBxp3feCZgnRH9W/%E3%82%81%E3%81%90%E3%82%8B%E5%AE%9D%E7%9F%B3%E8%8A%B1?node-id=0-1&node-type=CANVAS&t=iLmz4CZDgK6k6njm-0


## ER図作成

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

## 反省点

### ・**機能拡張に伴う問題**

アプリの機能を拡張する際、いくつかの機能間で十分な連携が取れていない部分がありました。特に、リアルタイムチャット機能と通知機能の連携が不十分で、ユーザー体験に一貫性を持たせるべきだったと反省しています。

### ・**コードの整理が不十分**

パーシャルを多用した結果、コードが分散し、冗長になってしまいました。特にビュー関連のコードは再利用しづらく、最初から保守性を意識してモジュール化するべきでした。この点は今後のプロジェクトで改善したいと思います。

 **・テストコードの実装不足**

リアルタイム通信やAPIエンドポイントに対するテストを十分に実装しなかったことが、後から問題を引き起こしました。今後は、開発段階からテストコードをしっかりと組み込むことを意識し、アプリの信頼性を高めたいです。

### ・**レスポンシブ対応の不備**

スマートフォン対応が一部の画面に限られており、特にチャット画面や通知画面で操作性に課題がありました。全画面で一貫したレスポンシブデザインを導入できなかった点については、早めに対応するべきだったと反省しています。

---

## 今後の展望

- **テストコードの実装**: RSpecとrbocopを主体に、ユニットテストや統合テストの充実を図り、コードの品質と安定性を向上させ、予期しないバグを早期に発見できる体制を整えていきたいです。
- **リアルタイム通知の改善**: 現在はTurboを使ってボタンに通知データを送る仕組みですが、今後は**Action Cable**を活用して、非同期のリアルタイム通知を実装し、ユーザーがアクションを起こさなくても新しいメッセージや贈り物を即座に受け取れるようにしていきたいです。
- **動的OGPの導入**: 投稿内容に基づいてOGP（Open Graph Protocol）を動的に生成し、SNSでシェアされた際に適切な内容が表示されるようにしていきたいです。これにより、シェア機能を通じてアプリのトラフィック増加を期待しています。
- **外部通知機能の実装**: メールやプッシュ通知を使用した外部通知機能を追加し、ユーザーがアプリ外でもリアルタイムで重要な通知を受け取れるようにしていきたいです。
- **ChatGPT APIの導入**: ChatGPT APIを活用し、相談内容のフィルタリングや内容分析機能を強化し、質の高い相談内容を提供するとともに、スパム対策や自動応答機能を実現していきたいです。

---

## 技術スタック

| カテゴリー | 使用技術 |
| --- | --- |
| **サーバーサイド** | Ruby 3.3.1, Ruby on Rails 7.1.3 |
| **データベース** | PostgreSQL (Heroku Postgres Mini, ローカル: Docker) |
| **認証** | Devise, OmniAuth (Google, Discord, GitHub,) |
| **描画関係** | SCSS (アニメーション), bulma, Stimulus |
| **リアルタイム通信** | Action Cable (Heroku Data for Redis Mini) |
| **検索機能** | Elasticsearch, searchkick (ローカル: Docker, 本番: Bonsai Elasticsearch Sandbox) |
| **スケジューリング** | Heroku Scheduler Standard |
| **Webサーバー** | Puma |
| **デプロイ** | Heroku |
| **開発環境** | Docker, bun |
| **モダンJSフレームワーク** | Hotwire (Turbo Rails, Stimulus) |
| **その他のツール** | Redis |

---

## 終わりに

今回のアプリ開発において、相談に乗ってくださった皆様、応援してくださった皆様、そしてアプリを試してフィードバックをくださった方々には、心から感謝しています。皆さんの支えがあったおかげで、このアプリを形にすることができました。

まだまだ改善点は多いですが、これからも学び続け、アプリをより良いものに成長させていきたいと考えています。また、今後は他の生活や問題解決に役立つアプリの開発にも挑戦していく予定です。

最後までお読みいただき、長文となってしまいましたが、最後までお付き合いいただきありがとうございました！今後ともよろしくお願いいたします。