Ruby / Ruby on Rails 開発道中記 第2章 〜MVCと検証に触れてみよう〜

# はじめに
この記事は前回の続き、[Ruby / Ruby on Rails 開発道中記 第1章 〜Rubyと友達になる〜](https://qiita.com/Hiro710/items/4cc2abf1811ce291dda2) の続編です。

Railsのインストールや設定等の説明については省略します。
また、今回は内容が多少飛び飛びです。ご了承ください。

# RailsにおけるMVC

RailsのMVCは以下の様な機能によってアプリケーションを動かしています。


- Model

データとデータに関わるアプリケーション特有の処理をオブジェクトとして実装したもので、データは大概、データベースで永続化されるが、データベースへの保存や読み込みもモデルが担っています。

- View

ブラウザに表示する画面、HTMLなどの見た目に関わる部分です。必要に応じてコントローラからモデルのオブジェクトなどを受け取り、画面に表示します。

- Controller

ユーザーが操作するブラウザなどのクライアントからの入力(リクエスト)を受け、適切な出力(レスポンス)を作成する為の制御を行う部分です。必要に応じてモデルを利用したり、ビューを呼び出したりして、レスポンスを作り上げます。モデルとビューのコントロールを行います。

# ルーティング(Routing)

ルーティングはWebサーバを介してクライアントからのリクエストを元にコントローラのアクション(メソッド)を探して、レスポンスとして結果をクライアントへ返します。ルーティングはコントローラを基にビューやモデルのデータベースへアクセスしたりするクライアントとの橋渡し的役割を担っています。

# マイグレーションへの理解

開発状況に応じてデータベース内にテーブルやカラム、インデックス等を追加・削除したり、既存データに修正を加える必要が出てきます。
これを簡単に行えるようにしてくれるのがマイグレーションです。

マイグレーションは1つのマイグレーション(ファイル)が1つのバージョンとして扱われる為、1つのマイグレーションを適用することでデータベーススキーマのバージョンを1つ上げることができ、適用済みのマイグレーションを1つ取り消すことでバージョンを1つ下げることができます。
マイグレーションファイルを作成しただけではデータベースは変更されず、マイグレーションを適用してはじめて、マイグレーションファイルに書かれたRubyコードが実行され、データベースが実際に変更されます。逆に適用済みのマイグレーションファイルを取り消す際は、マイグレーションを取り消すコマンドを実行して、マイグレーションファイルに書かれた取り消し操作を適用する必要があります。

| マイグレーションコマンド       | 説明                                 |
|:-----------------------|:-------------------------------------|
| $ bin/rails db:migrate | 開発用データベースにマイグレーションを適用する。デフォルトではこの設定になっている(最新までマイグレーションが適用されます) |
| $ bin/rails db:migrate RAILS_ENV=production | 本番用データベースにマイグレーションを適用する |
| $ bin/rails db:migrate RAILS_ENV=test | テスト用データベースにマイグレーションを適用する |
| $ bin/rails db:migrate VERSION=マイグレーションファイル名の先頭の数字部分| 特定のバージョンまでマイグレーションが適用された状態にする |
| $ bin/rails db:rollback | バージョンを1つ戻す |
| $ bin/rails db:rollback STEP=2 | バージョンを指定したステップ数だけ戻る |
| $ bin/rails db:migrate:redo | バージョンを1つ戻してから1つ上げる(バージョンは最終的には変化しないが、バージョンを戻す処理が想定通り動作することを確認できる) |

# モデルの検証(バリデーション)を行う

バリデーションは開発者がユーザーに期待する入力をさせるために内容の範囲を制限するために使われます。
また、制限するだけでなく、制限に引っかかった場合にユーザーに丁寧なわかりやすいエラーメッセージとして知らせる必要があり、それをバリデーションが手助けします。
詳しい内容は[こちら](https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)を参考にしてください。

以下はよく使われる検証用ヘルパーです。

| ヘルパーの使用例(対象属性名を:fooとしています) | 検証内容                  |
|:-------------------------------|:--------------------------------|
| validates :foo, presence: true | 入力必須データが入っているか？ |
| validates :foo, numericality: true | 数値以外が入ってきていないか？小数点の有無・正負などが期待通りの数値か？ |
| validates :foo, inclusion: { in: 0..9 } | (数値の)範囲が期待通りか？ |
| validates :foo, length: { maximum: 30 } | 文字列の長さが想定通りか？(例では最大30文字) |
| validates :foo, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i } <br> validates :foo, inclusion: { in: %w(OK NG)} | 文字列のフォーマットや構成文字種が想定通りか？ |
| validates :foo, uniqueness: true | データが一意になっているか？ |
| validates :foo, confirmation: true | パスワードやメールアドレスが、その確認用の入力と一致しているか？ |

バリデーションではオリジナルの検証コードを書くこともできます。
以下は名前(name)にカンマが含まれているかどうかを検証する例です。

```ruby:app/models/sample.rb

class Sample < ApplicationRecord
  # 自作の検証を利用する際はvalidatesではなくvalidateで指定する
  validate :validate_name_not_including_comma

  private

  def validate_name_not_including_comma
    errors.add(:name, 'にカンマを含めることはできません') if name&.include?(',')
  end
end
```

# 最後に

今回はRailsにおけるMVCモデルとルーティング、マイグレーション、モデルの検証を取り上げました。
RubyやRailsにはまだまだ沢山のメソッドなどがありますが、開発を通じて学んでいくのがベストだと思います。