今回は、以下のテーブル設計に沿ったモデルを作成する。
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