RailsでWebアプリケーション開発【入門】

## はじめに
Railsを使ってWebアプリケーションを作成しようとしている人向けです。
環境構築や実装方法より、考え方や手順をざっくり記載しています。

## アプリケーション開発の注意点

### 1. いきなり開発しない
経験が多くないエンジニアはすぐ開発しがちですよね、私も最初はそうでした。
まずはアーキテクチャを考えましょう。
以下のようなことを考えてみましょう。

- どんなフレームワークやライブラリを採用する？
- version管理は何でするの？
- デプロイするサーバーは？
- なんのデータベース使うの？
- どんなGemが使えそう？

などなど

### 2. しっかり設計する
画面設計やデータモデル設計をしておくと開発が効率的
簡単にまとめると

- 要件をしっかり確認する
- 画面のイメージを考える
- データモデルを設計する
- ER図を書く
- 画面の詳細を設計する
- 機能の詳細を設計する

などなど

### 3. 事前に効率的な開発方法をいろいろ調べる
railsには様々な便利機能があります。
例えば

- `Device`という`Gem`を利用するとすぐに認証機能が作れたりします。
- `scaffold`というMVCを簡単に生成してくれる機能なんかもあります。
- `haml`を使うとViewの開発効率があがります。

などなど

### 4. WBSを作ろう
[WBSとは（Work Breakdown Structure：作業分解構成図）](https://products.sint.co.jp/obpm/blog/serial-umeda07)
納期が決まっている場合はどの作業にどのくらいの時間が割けるのかをよく考えましょう。
闇雲に目の前の壁を突破しようとするより、事前にスケジュールをしっかり練るほうが良いです。
ちゃんと全体のスケジュールを理解し、作業時間を見積もることで無理なく開発することができます。


以降では「実際どのようにやるんだい？」ってとこを解説します。

## 設計

まずは設計します。開発は最後！

### 1. 要件をしっかり確認しよう

要件定義という言葉があるのですが、これはそんなに難しく考えずに要は**システムを作って欲しい人**がどんなものを求めているのかをしっかり確認して認識をすり合わせるということです。

この要件定義がしっかりできていないと、後で「思ってたのと違うので作り直してほしい」といった出戻りがめちゃくちゃ増えます。

[参考:要件定義について](https://it-trend.jp/development_tools/article/32-0060#:~:text=%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9%E3%81%A8%E3%81%AF%E3%80%81%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0,%E3%81%84%E3%81%8F%E4%BD%9C%E6%A5%AD%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82)

### 2. サイトマップを考えてみよう

![サイトマップ.png](https://qiita-image-store.s3.amazonaws.com/0/136533/e3b9693b-003e-7aed-b1b1-c290033a09a4.png)

 サイトマップを作成する効果

- 必要なページが洗い出せる
- 画面間のつながりを視覚化できる


[参考:サイトマップとワイヤーフレーム」自分のブログをデザインするまでの流れ](https://liginc.co.jp/260437)

### 3. ワイヤーフレームを作ってみよう

![ワイヤーフレーム.png](https://qiita-image-store.s3.amazonaws.com/0/136533/72610976-6c84-aa23-a386-6db27dd7aa9f.png)
ワイヤーフレームイメージ

ワイヤーフレームを作成する効果

- 頭の中にあることを形に出来る
- 簡単に作成できる
- 固まったデザインを見せるより、周りの人が意見を出しやすい
- チーム内・クライアントとの共有
- 仕様説明を記載

以上のような理由から開発効率があがります。

私の会社ではXDのようなプロトタイピングツールを積極的に採用しています。

[XD公式](https://www.adobe.com/jp/products/xd.html)
[非常に参考になる動画](https://www.youtube.com/watch?v=oHI_ceh2nwg)

### 4. デザインをざっくり考えてみよう

ざっくりとしたデザインを考えてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/9943fd44-c001-2bff-32bc-27901d2e96b2.png)


### 5. データモデルを設計しよう

[参考（引用元）：開発現場ですぐに通用する“今どきの”モデリングテクニック](https://www.ulsystems.co.jp/topics/007)

ここが大事！
RDB（リレーショナルデータベース）を扱う時はデータモデリングは必須です。

データモデル設計は以下の効果があります

- 必要なデータが洗い出せる
- データのつながりが視覚化できる
- チームの認識合わせ
- 開発時のコスト削減

私はいつも画面設計したら、登場人物（データモデル）を洗い出します。
その際に登場人物の関係性もざっくり考えましょう。
論理モデルがある程度固まったら、ER図を作成しましょう。
私はだいたい[MySQL Workbench](https://www.mysql.com/jp/products/workbench/)を使っています。

論理モデルイメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/f4ade614-185d-32b5-49b2-74d4c9a93d5e.png)

物理モデルイメージ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/2727896f-b30a-b3b2-83c4-67fffc7f7168.png)



### 6. 機能設計をしよう

簡単にいうとコントローラの設計です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/136533/43c4f8d9-3918-edcb-0e28-58634cb42d93.png)

例えば上の画面イメージの`Sign inボタン`を押すと`どんなコントローラー`が呼び出されて、`どんなデータ`がやりとりされるんだろうということを開発をする前に、考えて視覚化します。

上の例でいうと

1. UserControllerが呼び出される
2. 入力されたEmailとパスワードがUserテーブルに存在するかチェックする
3. 存在すればTopページへ遷移、存在しなければ`Sign up`へ遷移

するといった処理の流れが予想できます。

インプットはEmailアドレスとパスワード
アウトプットは次の画面

という感じに扱うデータやViewの流れが見えてきます。
処理内容を事前に固めておくことで開発時に「なにすればいいんだっけ？」ということにならなくなります。


## 実装

### 設計で色々考えたはずなのであとは実装するだけです。

### 1. 準備
バージョン管理とても大事です。
必須です。
私はよくgitでバージョン管理しています。
バージョン管理なしで実装するのは命綱無しの綱渡りと一緒です。

効果

- やり直せる
- 履歴を確認できる
- プロジェクト管理ができる
- チーム開発が効率的になる

[参考：Gitの基礎](https://qiita.com/satoshi1335/items/ead109412430a078feaa)


### 2. ひな形を作る

scaffoldは簡単に言うと、雛形をサクッとつくってくれます。
一瞬で必要最低限のものを揃えてくれます。
詳しくは以下、またはググりましょう。

[参考:覚えておくと超便利！Ruby on Railsのscaffoldの使い方【初心者向け】](https://techacademy.jp/magazine/7204)

### 3. ある程度viewを整える

scaffoldは必要最低限なのでデザイン性が皆無です。
英語オンリーです。

多言語化については以下
[参考:i18nについて](http://morizyun.github.io/ruby/rails-function-i18n-internationalization.html)

例えばBootstrapを適用してそれっぽくするだけでも違います。
詳しくは以下

[参考：Railsアプリで Bootstrap 4 を利用する](https://qiita.com/NaokiIshimura/items/c8db09daefff5c11dadf)


### 4. modelに必要なメソッドを作成する

railsは基本的なcrudはサポートしてるので簡単に以下のようなことができます。


```

User.find(1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1

```


例えば管理者か判定したいなんて場合はどのようにしたら良いでしょう？

```

User.isAdmin(1)
=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 AND admin_flg = 1

```

例えば上記のように使えたらいいですよね。
その場合は`model`に`isAdmin`メソッドを実装してあげればいいんです。

```user.rb
class User < ApplicationRecord

  def self.isAdmin? user_id
    return User.where('user_id = ? AND admin_flg = 1', user_id)
  end

end

```

みたいな感じでみんながよく使う機能は簡単に使えるようにModelにまとめておきましょう。



### 5. helperを駆使する

すごく便利な機能です。
あらかじめよく使う機能はhelperにまとめておくことで開発効率が段違いです。

使い方は以下を参考に

[参考:Rails入門】helperの使い方まとめ](https://www.sejuku.net/blog/28563)

### 6. コントローラーを実装する
あとは事前に考えた設計通りにデータを操作したり、画面遷移を設定するだけ

### 7. Viewを綺麗にする

cssをガンガン適用しましょう！


##　最後に

簡単に考え方や方法をまとめました。
設計や実装はこれが正しいやり方だというルールはありません。
ただ大切なことは、先人たちがいろいろ苦労して編み出した効率的な方法はたくさんあるということです。
それらを有効活用することで同じ轍は踏まないようにしていきましょう。
以上です。読んでいただきありがとうございました。