LoginSignup
3
1

More than 5 years have passed since last update.

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

Posted at

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

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 で生成

$ 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 コマンドはカラムに色々とオプションを付けられたりするので、便利。

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

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 はジェネレーターでつけられなそうなので、手で修正する

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 すれば、マイグレーションは完了。

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

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

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

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

  has_secure_password
end

rails console で確認しておく

[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 を書く

spec/factories/administrators.rb
FactoryBot.define do
  factory :administrator do
    name "テスト管理者"
    password "password"
  end
end
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 の通過を確認する

$ 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

日本語化する

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

rails console で確認

[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 を作成して、以下を記述する。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1