Rails 新規アプリケーション作成 ワークフロー

#はじめに
最低限の動きをする新規アプリケーション作成のワークフローをまとめようと思います。

#新規アプリケーション作成時の作業
大まかな作業は次のようになります。

* 新規アプリケーションの土台を作る
* モデルの準備
* コントローラの準備
* ルーティングの定義
* ビューの準備
* モデル、ビュー、コントローラの連携

それでは、各作業について細かく見ていきます。
#新規アプリケーションの土台を作る
##新規アプリケーションの作成
土台となるスケルトンを作成します。
ターミナルにて次のコマンドを実行します。

```
rails new fruitapp
```
fruitappは新規作成するアプリケーションの名前となります。

また、Railsのバージョンやデータベースの種類を指定したい場合はこの時点で指定します。
「Railsのバージョンが4.0.5」で「データベースがMySQL」の場合は次のようにコマンドを実行します。

```
rails _4.0.5_ new fruitapp -d mysql
```
##データベースを作成する
ターミナルにて次のコマンドを実行します。

```
rake db:create
```

##HTTPサーバを起動する
Railsには、WEBrickというHTTPサーバを利用できるライブラリが用意されています。
WEBrickサーバを起動するには、アプリケーションルートの配下にて次のコマンドを実行します。

```
rails s
```
「rails」の後に続く「s」は、「server」の略です。
「rails server」でも同じ結果となります。

サーバを停止する場合は、ターミナルにて「control + C」を入力します。
##アプリケーションにアクセスする
WEBrickを起動したら、ブラウザに次のURLを入力しアクセスします。
http://localhost:3000/

<img width="641" alt="rails_default_page.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471978/67c30cec-fc7b-0839-7c66-7883e11af98e.png">

デフォルトのRailsのページが表示されていれば、正しく動作しています。

ここまでで新規アプリケーションの土台づくりが終わりました。
#モデルの準備
##モデルクラスの作成
データベースにアクセスするためのモデルクラスを作成します。
ターミナルにて次のコマンドを実行します。

```
rails g model fruit name:string
```
「fruit」の部分はモデル名となります。
「name:string」はフィールド名とデータ型を定義しています。

コマンドを実行すると以下のファイルが作成されます。

* fruit.rb → モデルクラス
* 20190810224816_create_fruits.rb → マイグレーションファイル
* fruits.yml → フィクスチャファイル
* fruit_test.rb → モデルクラスのテスト用ファイル

この時点ではまだテーブルの作成は終わっていません。

railsではテーブルの作成や更新をする場合、マイグレーションという仕組みを使います。
「rails g model fruit name:string」コマンドによって「db/migrate」フォルダに作成された
マイグレーションファイルを使います。
##マイグレーションファイルの構造
作成されたマイグレーションファイルは次のようになります。

```ruby:20190810224816_create_fruits.rb
class CreateFruits < ActiveRecord::Migration[5.2]
  def change
    create_table :fruits do |t|
      t.string :name

      t.timestamps
    end
  end
end
```
「create_table :fruits」は作成するテーブル名を定義しています。
「t.string :name」はデータ型とカラム名を定義しています。
マイグレーションファイルを書き換えることにより、作成するテーブルを修正することができます。

```ruby:20190810224816_create_fruits.rb
class CreateFruits < ActiveRecord::Migration[5.2]
  def change
    create_table :fruits do |t|
      t.string :name
      t.integer :price # 追加

      t.timestamps
    end
  end
end
```
##マイグレーションの実行
ターミナルにて次のコマンドを実行します。

```
rake db:migrate
```
コマンドを実行すると、マイグレーションファイルの通りにテーブルが作成されます。

| id                    | name | price | create_at | update_at |
|:----------------------|:-----|:------|:----------|:----------|
| ※レコードはまだ入っていません |      |       |           |           |
ここまででモデルの準備が終わりました。

#コントローラの準備
##コントローラクラスの作成
ターミナルにて次のコマンドを実行します。

```
rails g controller fruits
```
「rails」の後に続く「g」は、「generate」の略です。
「rails generate controller fruits」でも同じ結果となります。
また、「fruits」の部分はコントローラ名となります。

実行後、app/controllersフォルダにfruits_controller.rbファイルが作成されます。

```ruby:fruits_controller.rb
class FruitsController < ApplicationController
end
```

##コントローラクラスにアクションを定義する
アクションとは、クライアントからのリクエストに対して実行するメソッドです。
コントローラには複数のアクションを定義できます。
コントローラにindexアクションを定義する場合、次のように記述します。

```ruby:fruits_controller.rb
class FruitsController < ApplicationController
  def index
  end
end
```
ここまででコントローラの準備が終わりました。
#ルーティングの定義
ルーティングとは、クライアントからのリクエストに応じて呼び出すコントローラとアクションを決定します。
ルーティングは、「/config/routes.rb」ファイルに定義します。

```ruby:routes.rb
Rails.application.routes.draw do
  get 'fruits' => 'fruits#index'
end
```
上記の場合、「/fruits」が末尾に付くリクエストに対し、fruitssコントローラのindexアクションを呼び出すと定義しています。
#ビューの準備
##ビューの基礎
ビューとはクライアントに返されるERBテンプレートのことです。
テンプレートにはHTMLにRubyのコードを埋め込むように記述されます。

```erb:index.html.erb
<h1>テスト</h1>
```
テンプレートは「/app/views」フォルダに、「コントローラ名/アクション名.html.erb」というファイル名で保存します。
今回はapplesコントローラのindexアクションに対応したテンプレートなため、構成は
「/app/views/fruits/index.html.erb」としています。

ここまででビューの準備が終わりました。
#モデル、ビュー、コントローラの連携
##コントローラとモデルの連携
データベース操作をする場合、コントローラのアクションにてモデルクラスのメソッドを用いることで実現できます。

```ruby:fruits_controller.rb
class FruitsController < ApplicationController
  def index
    fruit = Fruit.find(1)
  end
end
```
Fruitモデルクラスより、fruitsテーブルのidが1のレコードを取得し、
変数fruitに代入しています。

これでコントローラとモデルの連携が終わりました。
##コントローラとビューの連携
テンプレート変数を用いることで、アクションとビューとでデータを受け渡すことが可能です。

テンプレート変数は、コントローラで「@テンプレート変数名 = 値」と定義します。

```ruby:fruits_controller.rb
class FruitsController < ApplicationController
  def index
    @fruit  = Fruit.find(1)
  end
end
```
定義した@&#x200b;fruitは、ビューで「@&#x200b;fruit」と記述することで参照できます。

```erb:index.html.erb
<%= @fruit.name %>
<%= @fruit.price %>
```

<img width="128" alt="controller2view.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471978/ed9182bb-7027-0031-51df-a1dfe2da93eb.png">

これでコントローラとビューの連携が終わりました。
#おわりに
最低限の動きをする新規アプリケーション作成のワークフローをまとめました。
アプリケーション作成時はこのワークフローをもとにスムーズに作成できればと思います。