[個人開発]Ruby on Railsで阪神ファンのためのアプリを開発しました！

はじめまして！
オンラインスクールにてRuby on Railsを学習中の初学者です。
この度卒業制作で「甲子園NOW!」というアプリを作成いたしました。
<p>⚠️現在一旦停止中⚠︎</p>

<img src="https://kousiennow.onrender.com/assets/thumbnail-914c15cf94e87cfbe56d2b4835b3c005fb8b4c4726bba16b1c7b586cce3c806d.png">
甲子園球場の盛り上がりを可視化することができ、ファン同士の交流を促進できるようにしています。
砕けて言えば、周りのファン同士は友達になれるけど、遠くの席のファンの方とも持ち上がりを共有したい！という私の願望がこもっています。笑
ライトスタンドの盛り上がりを３塁アルプスからでも共有したいというエゴです。笑
阪神ファンの方はぜひ！使ってみてください＾＾
阪神ファンじゃない方も触っていただけると、甲子園で野球が見たくなるはず！？笑
<br>

Github : <a href="https://github.com/CarBoss1996/kousienNow">甲子園NOW Github</a>
サービスURL ：　<a href="https://kousiennow.onrender.com/">甲子園NOW!</a>

<h3>開発環境</h3>
・Ruby on Rails 7.1<br>
・Ruby 3.2.3<br>
・Javascript<br>
・VScode<br>
・Git・Github<br>

<h3>インフラ</h3>
・render <br>
・render PostgreSQL<br>
・Amazon S3

<h3>機能一覧</h3>
・ユーザー登録　( gem devise )<br>
・いいね・コメント機能　( turbo )<br>
・位置情報登録機能　（ Geolocation API、Javascript ）<br>
・アイコンの表示機能　（　turbo、Javascript　）<br>
・カレンダー機能　（ gem simple_calendar ）<br>
・コメント通知機能　（　line-bot-api　）<br>
・OmniOAuth認証機能　（　Google+ API、LINEログイン　）<br>

<h3>ビジョン・ポイント</h3>
当初から思い描いていたビジョンとしては、甲子園球場内での使用が主となるので、スマホユーザーを前提としたアプリ設計を意識していました。<br>
レスポンシブデザインに対応することでスマホでもPCでも見やすいように工夫しました。<br>
OmniOAuth認証を実装することで、パスワード入力の煩わしさを無くし、ログインのしやすさを意識しました。<br>
どこにどれくらいのユーザーがいて、それぞれどのように楽しんでいるかを一目で確認できるような設計を意識しました。<br>
以降は本開発で特に苦労したこと、工夫したことを記載していきます。

<h3>位置情報機能</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/da309740-0ad4-0938-8b88-f0266a0e66df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/48e7d845-86d4-7998-7e9f-bae5301a9c7a.png)



この機能はこのアプリのメイン機能なので、特にこだわりました。<br>
Geolocation APIで緯度経度を取得して、seeds.rbに記載しているシートごとの緯度軽度の範囲と比較して現在位置を割り出すという感じです。<br>
Javascriptファイルからseeds.rbのデータを直接持ってくることはできないので、Ruby on RailsのActiveModel::Serializer を使用して、APIエンドポイントからデータを持ってくることに成功しました。<br>
実際に甲子園球場にPC持っていって、中の通路を移動しながら位置情報を取得してテストを実施しました。

詳細記事はこちら

https://qiita.com/CarBoss1996/items/b4fd751b49aaddf6ae6e

<h3>アイコンの表示機能</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/7e708d43-e762-e710-30e9-94a6df330616.png)


上記で取得した位置情報に好きなアイコンをつけて、甲子園球場の画層の上にアイコンを該当のシート位置に表示させる機能です。<br>
甲子園球場の画像を縦横 ( x.y )１００％比率で設定して、seeds.rbにポリゴン（多角形）でpointsとしてJSON形式で保存。<br>
例えばバックネットは、

```seeds.rb
seat_name: "backnet", points: [{ x: 36, y: 72 }, { x: 25, y: 81 }, { x: 32, y: 86 }, { x: 58, y: 86 }, { x: 67, y: 81 }, { x: 55, y: 72 }] }
```
という感じで定義していきました。<br>
ちなみに甲子園球場の緯度軽度の情報も上記のpointsの取得もどっちも手作業です(^^;

詳細記事はこちら

https://qiita.com/CarBoss1996/items/ea28523fe9d7a090d4c0

<h3>カレンダー機能</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/5949da1e-f8a7-2f49-9633-03a588467df1.png)


Google Calendarを実装していた方が楽だったかな。。。と思いながら、simple_calenderでなんとか実装できました。<br>
試合日程をすぐに確認できるように、カレンダーの右上に月のリンクを用意しているのですが、このリンクを踏むと任意の月の１か月の試合データが閲覧できるというふうにしたくて、これがかなり大変でした。
simple_calendarにはPrevious（先月）、Next（来月）がデフォルトで提供されていますが、それだとひと月ごとにしか移動できないので不便だなと思い、show_month.html.erbというファイルを作成して、リンクを踏んだらshow_monthで月のデータを取得して表示させるようにしました。
でも試合データやイベントデータは手入力です(^^;
Ruby on Railsにもスクレイピングありますが、Python勉強したいので、その後スクレイピング入れる予定です！

詳細記事はこちら

https://qiita.com/CarBoss1996/items/9025e0c13ffaf1dc4c55

<h3>コメント通知機能</h3>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/5df5a06e-ac33-6ed0-1ed3-d9adefe03d7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/fa257e37-1662-f78e-c8ed-b63e32a9791d.png)


LINE Messaging APIの甲子園NOW!のアカウントを作成して、そのQRコードを読み取ってもらい、アカウントを友達追加したら「通知設定」とメッセージを送ると、ワンタイムコードとリダイレクトURLを送信するようにしました。

そのリダイレクトURLでアプリに戻ってログインして、ワンタイムコードを入力するとユーザーのLINEアカウントIDと甲子園NOW!のアカウントIDが連携されます。

連携されるとそのユーザーの投稿にコメントがついたら、LINEに「あなたの投稿に〇〇さんからコメントがあります。（コメント内容）（該当の投稿の詳細のURL）」が送られてくるようになります。

これによりユーザ交流のリアルタイム性が高まり、メッセージのやり取りが容易になります。

こちらは詳細記事が工程ごとに分かれています。

https://qiita.com/CarBoss1996/items/e619335206076301e00f

https://qiita.com/CarBoss1996/items/fba0f499160f0d4530d7

https://qiita.com/CarBoss1996/items/0354f4d2113550d1b291

<h3>OmniOAuth認証機能</h3>

<a href="https://gyazo.com/3e76d1f8362d46f4aee20d11235d80f5"><img src="https://i.gyazo.com/3e76d1f8362d46f4aee20d11235d80f5.png" alt="Image from Gyazo" width="945"/></a>

スマホユーザー対象にしているので、LINEログインはつけたいなと考えていました。

そしてタイガースファンのおっちゃんたちは認証怖いから通常ログインがいいとか言いそうと思って通常ログインも残しました。

オンラインスクールの卒業制作ということもあり、講師も生徒もPCで触ってくれる機会が多いだろうなということでGoogle認証もつけましたが、これらを連携させるのがなかなか大変でした。

emailを起点としてユーザー検索をしているので、通常ログインとGoogleログインは連携できたのですが、LINEにはメールアドレスを登録していない方が多いので、nilで送られてきた場合はカスタムアドレスを設定してバリデーションを回避しました。

ただそうするとアカウント連携ができないので、カスタムアドレスで登録しているユーザーはメールアドレスの登録を促すモーダルをトップページに表示させるようにしました。


<h3>テーブル構成</h3>
今回自分で思っていたより機能が多かったので、それに伴ってテーブルもかなり多くなってしまいました。<br>
<img src="https://i.gyazo.com/4081d7f56fe0ec97604c266948a87eb7.png">
<br>
簡単に解説すると、<br>
・ユーザーテーブル<br>
・投稿テーブル<br>
・コメントテーブル<br>
・いいねテーブル<br>
・座席テーブル（甲子園の画像上にアイコン出す方）<br>
・ユーザーの座席テーブル（ユーザーが保持しているアイコン位置を保存する）<br>
・シートテーブル（現実の座席位置情報を保持する方）<br>
・試合テーブル<br>
・ユーザーに紐づく試合テーブル<br>
・イベントテーブル<br>
・イベントの日付テーブル<br>
・通知テーブル<br>
・ワンタイムコードテーブル<br>
・SNSログイン情報テーブル<br>
<br>
あとここに画像のアップロードにActive Storageを使用しているので、3つテーブルが加わっています。笑<br>
めっちゃ多い。。。笑

<h3>今後のアップデートについて</h3>
機能実装を最優先でやっていたので、もう少し見た目に気を遣って、UI/UXの向上に努めたいと考えています。<br>
具体的にはReactを使用したエフェクトの追加です。<br>
位置情報の登録後にXシェアを促すモーダルを表示していますが、ここにアニメーションをつけたり、投稿後、ログイン後、登録後、いいね時などにうるさくならない程度につけていきたいと考えています。<br>
そして先述しましたが、Python勉強時にスクレイピングで試合情報を取って来れるようにして、更新の手間を減らしたいと考えています。<br>
今後の勉強を兼ねてより充実したアプリにしていきたいと考えています。

<h3>最後に</h3>
最後までご覧いただきありがとうございます！<br>
未経験なのに実装テストなどあまりしないまま実装を進めてしまっていたので、壁にぶつかるばかりでしたが、完成したときは感動でした。<br>
そして機能内容については後々詳しく記事を書いていこうと考えています。<br>
まだまだ至らないところもありますが、今後もより良いアプリ開発に努めたいと考えています！
<br>