20万pv/月達成のwebサービスのRailsソースコード、全部見せます！

# はじめに

=====2019/08追記
おかげさまで 20万pv/月になりました！
=====追記終わり

=====2018/12追記
おかげさまで 14万pv/月になりました！
=====追記終わり

この記事は2年前の私が開発を始めたwebサービスのソースコードを公開するものです。
当時はプログラミングを独学で学び、リリースした初めてのwebサービスでした。

そんなRailsのソースコードを公開しようと思ったのは以下の理由からです。

- 自分のコードを見て、誰かに参考にしてほしい
- Railsを勉強中のひとのモチベにしてほしい
- [iOSアプリのコード公開記事](https://qiita.com/ryupaka/items/ea272c843d3ebf3b245b)に感化された

↑の筆者である@ryupakaさんの記事を参考にさせていただいています。ありがとうございます。

もし誰かがこの記事を参考にwebサービスをリリースできたら、そんなに嬉しいことはありません😭

# サービスの紹介

[「Rep 立教大学シラバス検索システム」](https://www.rep-rikkyo.com/)
立教大学生向けのサービスです。

ざっくりいうと、

- 授業情報の検索
- 授業のレビューの投稿

などができます。
授業データはクローラー（別のプログラム）で毎年度自動収集しています。

<img width="500" alt="スクリーンショット 2018-07-29 22.14.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/af3b720c-1e51-3865-0d22-2ea48e93b28e.png">

https://www.rep-rikkyo.com/

## なぜ10万pvに？

いたって普通のサービスですが、立教生には悩みがありました。それが **公式のシラバス検索システムが使いづらい** こと。
公式の検索システムは旧態依然。スマホ対応は愚か、ブラウザバックでエラーするという・・・。

そこでその代替サービスを作って公開したら、グングン成長していったわけであります。

# ソースコード

Githubにて公開しました。公開用のリポジトリを特別に作成し、一部重要・秘密な部分はダミー値を入れています。
そして **MITライセンス** です。

Rep + publicで「Republic」というリポジトリ名にしました。

リポジトリURL：https://github.com/SugiKent/republic

<img width="998" alt="スクリーンショット 2018-07-31 13.48.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/0867d22f-0d57-6942-c3b2-752064cc10df.png">


## 環境

Ruby: 2.5.1
Rails: 5.1.6

ぜひREADMEをご覧ください。

bundle installの完了とrails serverの起動を目標に環境構築すれば動くと思います。
しかし、PDF生成機能は`wkhtmltopdf`のインストールが別途必要です。
また、授業データは2017年度のものまでしか収録していません。

# 機能紹介

## ①授業検索

授業を検索できます。
現在production環境では2万以上の授業から検索して、結果を返します。

Githubのソースでは[このあたり](https://github.com/SugiKent/republic/blob/6ee7bb45852b8807550f1d12ade05cec08596d4e/app/controllers/classes/lesson_controller.rb#L24)
Repでは[このページ](https://www.rep-rikkyo.com/lesson/search?utf8=%E2%9C%93&name=%E7%B5%8C%E5%96%B6&content=&year=2018&campus=&faculty_id=&department_id=&term=1&day=&hour=&evaluation=&commit=%E6%A4%9C%E7%B4%A2)

<img width="233" alt="スクリーンショット 2018-08-01 0.47.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/115f8063-32fe-5f35-2d71-66b16769fadd.png">


## ②シラバスページ

授業の詳しいデータを見ることができます。
授業データの出力はシンプルですが、以下の点はぜひ見ていただきたいです。

- [パンくず](https://github.com/SugiKent/republic/blob/6ee7bb45852b8807550f1d12ade05cec08596d4e/app/views/classes/lesson/show.html.slim#L11)（一つ前の検索条件がパンくずに）
- [関連授業など](https://github.com/SugiKent/republic/blob/6ee7bb45852b8807550f1d12ade05cec08596d4e/app/views/classes/lesson/show.html.slim#L74)ページ下部の他授業へのリンク
- 授業で取り扱う書籍が[Amazonアフィリエイトリンク](https://github.com/SugiKent/republic/blob/master/app/views/classes/lesson/_textbooks.html.slim)

ちなみにここの[viewファイル](https://github.com/SugiKent/republic/blob/master/app/views/classes/lesson/show.html.slim)はかなりデカいです😥

Githubのソースでは[このあたり](https://github.com/SugiKent/republic/blob/6ee7bb45852b8807550f1d12ade05cec08596d4e/app/controllers/classes/lesson_controller.rb#L123)
Repでは[このページ](https://www.rep-rikkyo.com/lesson/17966)

<img width="233" alt="スクリーンショット 2018-08-01 0.54.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/2333d714-2a0d-e3a9-8c8a-d9bad814f3c0.png">


## ③レビュー登録

授業のレビューをユーザーが書いてくれます。
コメントは自由ですが、Slackに通知して全レビューを目視チェックしています。アブナイ表現のレビューは削除しますが、今の所ヤバいのはありません。

Githubのソースでは[このあたり](https://github.com/SugiKent/republic/blob/master/app/controllers/classes/result_controller.rb)

<img width="233" alt="スクリーンショット 2018-08-01 1.04.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/f7cf0abb-fd1f-94a5-e5c9-b63179258ecc.png">


## ④お気に入り登録

授業をお気に入りに登録できます。
一番利用しているユーザーだと100以上の授業をお気に入りしています。

Githubのソースでは[このあたり](https://github.com/SugiKent/republic/blob/master/app/controllers/classes/favorites_controller.rb)

<img width="324" alt="スクリーンショット 2018-08-01 1.05.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/105912f5-aeac-acec-134c-cec25da3fd5c.png">


## ⑤ユーザー登録/マイページ

ユーザー登録・ログイン周りは、有名なgemであるdeviseを利用しています。
立教生のメールアドレスだけで登録可能になるように、バリデーションをかけています。

マイページでは、お気に入りに登録した授業を時間割形式で閲覧可能です。

Githubのソースでは[このあたり](https://github.com/SugiKent/republic/blob/master/app/controllers/users/registrations_controller.rb)
Repでは[このページ](https://www.rep-rikkyo.com/users/sign_up)

<img width="233" alt="スクリーンショット 2018-08-01 1.08.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/073c3e2f-7c75-3fe8-1f44-04276728ab92.png">

## ⑥デプロイやインフラやデータ

CapistranoでEC2にデプロイしています。
毎月5000~6000円の請求がきます😇

- Capistrano（デプロイ）
- nginx
- unicorn
- AWS EC2（microインスタンス）
- AWS RDS Mysql

### データ収集

- [GoogleAnalytics](https://marketingplatform.google.com/about/)（言わずと知れたAnalyticsツール）
- [Redash](https://redash.io/)（SQLを生で書いてデータを取得）
- [LogRocket](https://logrocket.com/)（ユーザーの動きを動画で取得）

Redashは便利ですね。ユーザー数などを追っています。
<img width="500" alt="スクリーンショット_2018-08-01_1_32_36.png" src="https://qiita-image-store.s3.amazonaws.com/0/98204/a69ed6eb-4acc-89b9-a7cf-fcb1c12cc481.png">


## ⑦授業データ

データのインポートは`seed_fu`というgemを利用しています。
このgemはデータのidだけ被らない（変わらない）ようにしていれば、データを新規作成か更新かを判断してくれます。

授業データはcsv形式で用意します。
[こちらのファイル](https://github.com/SugiKent/republic/blob/master/db/fixtures/seeds.rb)にインポート用のコードが書かれています。
年度始まりに、 `bundle exec rails db:seed_fu` を実行することで授業データをインポートします。はい、**手動**です。


# プログラミングの勉強をしている方へ

- まずは[Rep](https://www.rep-rikkyo.com)を見てみてください
- 気になる機能がありますか？ `config/routes.rb` を見て、その機能のURLはどのcontrollerか把握しましょう
- 該当controllerの該当アクション内を理解しましょう。わからないメソッドがあればgrepや全文検索で定義元を見つけましょう。
- 該当viewを見ましょう。
- 以上の繰り返しで、ある機能の一連の流れがわかると思います。

# 最後に

最後までお読みいただきありがとうございます！🙇

Repはいたって普通のwebサービスですが、その分初学者の方でもひとつひとつの機能・実装は理解しやすいと思います。
このRepublicを見て、参考にして、新しいwebサービスやエンジニアが生まれてくれたらとても嬉しく思います☺️

この記事への**いいね**や、[Republic](https://github.com/SugiKent/republic)への**スター**をいただけるとご飯が美味しくなります😋

質問もウェルカムです！😆


### 追記

予想以上に多くの方に見ていただき、とてもうれしいです😂
コードもそうですが、Rep自体について興味を持ってくれる方も多く、[Twitter](https://twitter.com/sugiken_bike)でいくつか質問をいただいたりしました。
[私のブログ](http://kentear.hatenablog.com/archive/category/Rep)にはQiitaに書いてない、Repの記事がいくつかあります。こちらもぜひご覧ください！
http://kentear.hatenablog.com/archive/category/Rep