Rails 初期構築の際のモデルの初期化メモ

今回は、以下のテーブル設計に沿ったモデルを作成する。

**administrators（管理者テーブル）**

| カラム名 | 和名 | 型 | not_null | index | デフォルト値 | バリデーション | 備考 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| name | 名前 | string | ◯ | ◯ |  | presence |  |
| password_digest | パスワード | string | ◯ |  |  | presence |  |

**環境**

- ruby: 2.4.2
- rails: 5.1.4
- mysql: 5.7.XX

## rails g model で雛形を生成する

`rails g model` で生成

```bash
$ bin/rails g model administrator name:string:index password:digest
      invoke  active_record
      create    db/migrate/20171120031057_create_administrators.rb
      create    app/models/administrator.rb
      invoke    rspec
      create      spec/models/administrator_spec.rb
      invoke      factory_bot
      create        spec/factories/administrators.rb
```

- `db/migrate/20171120031057_create_administrators.rb`
- `app/models/administrator.rb`
- `spec/models/administrator_spec.rb`
- `spec/factories/administrators.rb`

の4ファイルが生成される。

`rails generate model` コマンドはカラムに色々とオプションを付けられたりするので、便利。

## マイグレーションファイルの修正とマイグレーション

```rb:db/migrate/20171120031057_create_administrators.rb
class CreateAdministrators < ActiveRecord::Migration[5.1]
  def change
    create_table :administrators do |t|
      t.string :name
      t.string :password_digest

      t.timestamps
    end
    add_index :administrators, :name
  end
end
```

`null: false` はジェネレーターでつけられなそうなので、手で修正する


```rb:db/migrate/20171120031057_create_administrators.rb
class CreateAdministrators < ActiveRecord::Migration[5.1]
  def change
    create_table :administrators do |t|
      t.string :name, null: false
      t.string :password_digest, null: false

      t.timestamps
    end
    add_index :administrators, :name
  end
end
```

この状態で `bin/rails db:migrate` すれば、マイグレーションは完了。

## モデルにバリデーションをかける

```ruby:app/models/administrator.rb
class Administrator < ApplicationRecord
  has_secure_password
end
```

password は `has_secure_password` でバリデーションがかかっているので、
今回は name のみ

```ruby:app/models/administrator.rb
class Administrator < ApplicationRecord
  validates :name, presence: true

  has_secure_password
end
```

rails console で確認しておく

```bash
[2] pry(main)> Administrator.create!
   (12.1ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
   (0.3ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: Validation failed: Name can't be blank, Password can't be blank
```

## spec を書く

```rb:spec/factories/administrators.rb
FactoryBot.define do
  factory :administrator do
    name "テスト管理者"
    password "password"
  end
end
```

```rb:spec/models/administrator_spec.rb
require 'rails_helper'

RSpec.describe Administrator, type: :model do
  let(:admin) { build :administrator }

  it 'has a valid factory' do
    expect(admin).to be_valid
  end
end
```

spec の通過を確認する

```bash
$ bin/rspec 
Running via Spring preloader in process 18001
.

Finished in 0.02865 seconds (files took 5.57 seconds to load)
1 example, 0 failures
```

## 日本語化する

```yml:config/locales/models/administrator/ja.yml
ja:
  activerecord:
    models:
      administrator: 管理者
    attributes:
      administrator:
        name: 管理者名
        password: パスワード
```

rails console で確認

```bash
[3] pry(main)> Administrator.create!
   (0.2ms)  BEGIN
   (0.2ms)  ROLLBACK
ActiveRecord::RecordInvalid: バリデーションに失敗しました: 管理者名を入力してください, パスワードを入力してください
from /Users/yuichiro/projects/iolite/vendor/bundle/ruby/2.4.0/gems/activerecord-5.1.4/lib/active_record/validations.r
```

### アプリケーション全体の日本語化について

https://github.com/svenfuchs/rails-i18n/blob/master/rails/locale/ja.yml から

`config/locales/ja.yml` を作成して、以下を記述する。

```rb:config/application.rb
    config.i18n.load_path += Dir[Rails.root.join("config", "locales", "**", "*.{rb,yml}").to_s]
    config.i18n.default_locale = :ja
```

- 参考
    - [Rails で I18n を使って日本語化 \- Qiita](https://qiita.com/yutackall/items/0ff97132f31e5bacbf00)