Ruby
Rails
vagrant

今更ながら Ruby on Rails Tutorial をやってみた (その6)

この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら面白そうという単純な理由からRuby on Rails Tutorialをやってみようと思い立ちました。今回は前回の記事の続きで第6章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。

第6章 ユーザーのモデルを作成する

Windows環境へのRubyセットアップをゆったりやっていたので前回から時間が経ちました。今回から第12章迄、全7章を通してログインと認証の機能を完成させていきます。

まず初めにUserモデルを作成します。ここで気を付けるべきは「コントローラ名には複数形を使い、モデル名には単数形を使う」という慣習です。コントローラはUsers、モデルはUserとなります。更に、「テーブル名は複数形を使う」という習慣の為、テーブル名はusersとなります。チュートリアル中は問題ないですが、独自に開発する際は以前紹介したactive_supportを活用して複数形・単数形に誤りがないようにしたいですね。

rails generate model ModelName column1:string column2:string ...

上記のようにコマンド実行することで、モデルの雛形を自動生成してくれます。

モデルのテスト駆動開発で詰まる

指示通りにtest/models/user_test.rbを編集し、rails test:modelsを実行したところ…

$ rails test:models
rails aborted!
ActiveRecord::Tasks::DatabaseAlreadyExists: ActiveRecord::Tasks::DatabaseAlreadyExists
/vagrant_data/environment/sample_app/bin/rails:9:in `require'
/vagrant_data/environment/sample_app/bin/rails:9:in `<top (required)>'
/vagrant_data/environment/sample_app/bin/spring:15:in `require'
/vagrant_data/environment/sample_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

Caused by:
Errno::ETXTBSY: Text file busy @ unlink_internal - /vagrant_data/environment/sample_app/db/test.sqlite3
/vagrant_data/environment/sample_app/bin/rails:9:in `require'
/vagrant_data/environment/sample_app/bin/rails:9:in `<top (required)>'
/vagrant_data/environment/sample_app/bin/spring:15:in `require'
/vagrant_data/environment/sample_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)
Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test

何やら怒られてしまいました。「テスト用のデータベースをマイグレーションしなさいよ」ということらしいですね。
そこで、rails db:migrateについて新たに学んだのがこちら。

migrateについて
rails db:migrate RAILS_ENV=test # テスト環境のデータベースをマイグレーションする
rails db:migrate # この場合 RAILS_ENV=development をデフォルトとして実行していたのでした
rails db:migrate:status # 現在のマイグレーション適用状況が確認できる

今回はrails db:migrate RAILS_ENV=testを実行することでエラーを解消することができました。
(関係ないですが、rails test:modelsrails t:modelsとは省略できないようです。)

モデルの構造変更

一度作成したモデルの構造を変更する場合はmigrationを使用します。

rails generate migration migration_file_name
# ファイル名を一定の規則で命名すると、その規則に従って自動的に適切なマイグレーションファイルが生成される
# 例えばファイル名を ..._to_users と命名すると、usersテーブルにカラムを追加するというマイグレーションが自動生成される

migrationによって作成されたファイルに変更内容を記述します。データモデルの変更が必要になったらその都度マイグレーションを行うのがRails流のようです。

その他、この章ではパスワードをセキュアに管理する方法について述べられています。
RubyGemsのbcryptを使用してハッシュ化したパスワードをデータベースに保持する作りとなっており、パスワード検証用メソッドであるauthenticateも提供されています。これにより、驚くほど少ないコーディングでセキュアな認証機構を作る土台が出来上がったことになります。

それでは、次回 第7章から再開したいと思います。