書籍やオンライン教材でRailsを勉強したけどイマイチRailsでオリジナルアプリが作れるようになったと感じない君へ

# はじめに

TwitterやブログなどでWebアプリの開発に興味がある人の「○○でRails勉強中！××章まで読み終わった！」といった趣旨の投稿を見る度に、 **○○を最後までやり終えてもWebアプリを作れるようにはならないよ** と思ってしまいます。

Webに限らずアプリ開発ができるようになるには **自分の頭で考え手を動かすことが必要不可欠** で、そのためには **簡単なもので良いのでオリジナルアプリを作成すること** が良いと思っています。そうは言っても「何を作ったらいいのかわからない」とか「どのように開発を進めればいいのかわからない」という人もいると思います。本記事ではそのような人を対象にRailsで簡単なオリジナルアプリを開発するためのポイントを紹介します。

## 補足: 書籍やオンライン教材を使った学習を否定はしていません

上の○○は書籍やオンライン教材を想定していますが、それらを使った学習が無駄と言うつもりはありません。書籍やオンライン教材は必要（最低限）な知識が体系立ててまとめられており、Railsについて体系立った知識を学ぶには適していると思います。

## 補足: スペック

「Rails初心者がいきなりオリジナルアプリを作るのは無理！」と思うかもしれませんが、Rails初心者の私が作れたので無理ではありません。

ちなみに私は業務ではC++を使うことが多く、ここ数年は弊社独自のC++製フレームワークを使ってWebアプリを開発しています（担当はフロントエンド）。 [あなたがマスターしたのはいくつ？ Railsを習得するために必要な技術要素の一覧](https://qiita.com/jnchito/items/063e332cbe3023f52f93) の内、基礎知識が身についているのはWWWとRuby言語くらいしかない、Rails初心者です（しかもRuby言語は個人的興味で [『プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで』](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976/ref=sr_1_1?ie=UTF8&qid=1549450385&sr=8-1&keywords=ruby) を一度読んだことがある程度です）。

# 作ったアプリ

開発のポイントを解説する前に、まずは作ったアプリを紹介したいと思います。

作ったのは「Reminder」という **よくあるTODOアプリにリマインドメールを送信する機能をつけたアプリ** で、予定を登録すると開始15分前にリマインドメールが送信されます。

かなり単純なアプリですが Action MailerやActive Jobなど、Railsが提供する機能にはそれなりに触れることができたと思います。

コードは [github](https://github.com/mizuhara/reminder) に置いてあります。

## 認証機能

メール認証をすることができます（deviseを利用）。

![ログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/28856/c31a20d9-3f55-0364-77ed-045d4a059713.png)

deviseの利用にあたっては [[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374) を参考にしました。

## 予定管理機能

予定の登録、閲覧、削除ができます。

![予定登録画面(1).png](https://qiita-image-store.s3.amazonaws.com/0/28856/39f8250e-b002-8762-c5d3-27b0ef1e8612.png)

カレンダーの日付を変更すると画面右側に表示される予定が、選択した日付のものに変わります（Ajaxを利用）。

![予定画面(2).png](https://qiita-image-store.s3.amazonaws.com/0/28856/079a5bfd-e31b-73e9-ab16-6cb2f933a8ce.png)

## リマインド機能

登録した予定の開始15分前にリマインドメールを送信します。

![メールサンプル.png](https://qiita-image-store.s3.amazonaws.com/0/28856/30cf1a5f-367d-c311-ec06-a3ce7475103b.png)

# スケジュール

開発期間は一週間、作業時間は平日は1〜2時間、休日は4〜5時間程度だったと思います。開発期間は一週間でなくても良いですが、 **モチベーションが続く期間に設定すること** が大事だと思います。

|期間|作業内容|
|:---:|:---:|
|2019/01/29 - 01/30|アイデア、要件検討|
|2019/01/31 - 02/02|設計、実装|
|2019/02/03 - 02/04|画面デザイン調整|

# アイデア、要件検討

個人でアプリを開発しようとする人が躓く最初のポイントがアイデア検討だと思います。躓くポイントはいくつかあると思いますが、大きいのは以下の2つでしょうか。

1. アイデアが浮かばない

2. アイデアはあるが「こんなの作って誰が使うんだろう？」などと思ってしまう

以下で対策を説明します。

## 1. アイデアが浮かばなくて困っている場合

この場合は **既存のサービスに簡単な機能を+αしたものを作る** という対策があります。今回の私がまさにこのケースで、チュートリアルでありそうなTODOアプリという既存サービスに、リマインドメールを送信する機能を+αしています。

もし+αが思いつかない場合は **Rails以外で作成されたアプリをRailsに移植する** でも良いと思います（元のアプリが多機能の場合はいくつか機能をドロップするのもアリ）。Rails以外のフレームワークのチュートリアルやQiitaの「○○で××を作った」系の記事を参考にしましょう。

## 2. アイデアはあるが「こんなの作って誰が使うんだろう？」などと思ってしまう場合

これについては **もともと誰かに使ってもらうことは想定していないので気にするだけ無駄** です。目的はサービス化ではなくRailsの学習なので、利用者がいる／いないは関係ないはずです。そもそも利用者を想定したアプリを開発するのはRailsをマスターした後であり、Rails初心者が気にする問題ではありません（Railsをマスターしてから悩みましょう）。

# 設計、実装

基本的には [『Ruby on Rails 5アプリケーションプログラミング』](https://www.amazon.co.jp/Ruby-Rails-5%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774188832/ref=sr_1_2?ie=UTF8&qid=1549452300&sr=8-2&keywords=rails) をリファレンス的に使い、途中何度か遭遇したエラーについてはエラーメッセージを読む（エラーメッセージが分かり難い場合はGoogle先生に相談する）ことで実装しました。

機能はあまりこだわらず簡単なものにしましたが、 **Railsらしいコーディング** をしたかったので設計・実装にはかなりこだわって作りました。

## Railsらしいコーディングについての勉強

Qiitaなどのネット記事を参考に勉強しました。いくつか見たのですが参考にしたのは以下の3つです。

- [実務で学んだRailsの設計・リファクタリング](https://qiita.com/yoshi_ksk/items/08ee0e4230893a770cce)

- [てめえらのRailsはオブジェクト指向じゃねえ！まずはCallbackクラス、Validatorクラスを活用しろ！](https://qiita.com/joker1007/items/2a03500017766bdb0234)

- [「プロを目指すRailsエンジニアのための公開コードレビュー」という発表をしました](https://blog.jnito.com/entry/2017/08/26/090024)

詳しく知りたい人は上記の記事を読んで欲しいのですが、以下の点に気をつけるとRailsらしいコーディングができそうです。

- MVCの責務やRailsの思想を理解する
    - Serviceクラスの導入を奨励？する記事もありますがActiveRecordの設計方針に反するのでやらない方が良い

- Railsが提供する機能を積極的に使う
    - CallbackクラスやValidatorクラスを活用すると責務分割が綺麗にできる
    - アソシエーションを使うとRailsらしいコードになる
    - 「規模の小さなアプリならコントローラも自然と薄くなるでしょ」と思っていましたが、スキル次第ということを知り、「実際にコーディングをする際は気をつけよう」と思いました

## 嵌った点

一番嵌ったのはタイムゾーンの扱いです。

「予定は登録できたのにリマインド時間（予定開始の15分前）になってもメールが来ないのは何で〜？」とデバッグをしていたら、タイムゾーンの設定が原因でした。タイムゾーンについては [RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い](https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c) を参考に学習しました。

# 画面デザイン調整

設計・実装とは違い、デザインに関してはbootstrapで見た目を整える程度でほとんどこだわりませんでした。理由は私がデザイナーではないことと、デザインはRailsとは関係が無いという認識のためです。

# おわりに

長めの記事になりましたが、RailsでWebアプリを作成した経験を踏まえ、RailsでWebアプリを作りたいけどなかなか作れないでいる人に伝えたいことをまとめてみました。