ぞえの技術めも

Ruby on Rails勉強中

【44日目】【1日20分のRailsチュートリアル】【第6章】ユーザーの有効性と存在性の検証

Ruby on Railsチュートリアル(第3版)

今日は「6.2 ユーザーを検証する」から。

6.2 ユーザーを検証する

要するに、nameとemailにあらゆる文字列を許すのは避けるべきです。これらの属性値には、何らかの制約を与える必要があります。

何でもありだといざ運用させたときに思わぬエラーを引き起こす可能性あるよね。
制約だいじ。

6.2.1 有効性のテスト

setupでUserオブジェクトを作成して、作成したUserオブジェクトが有効かどうか確認。

test/models/user_test.rb

require 'test_helper'

class UserTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: "Example User", email: "user@example.com")
  end

  test "should be valid" do
    assert @user.valid?
  end
end

テスト実行。

$ bundle exec rake test:models
1 tests, 1 assertions, 0 failures, 0 errors, 0 skips

問題なし。

6.2.2 存在性を検証する

name属性に空文字をセットして、
nameが空文字ならUserは無効とするようなテストを追加する。

test/models/user_test.rb

  test "name should be present" do
    @user.name = "     "
    assert_not @user.valid?
  end

テスト実行。

$ bundle exec rake test:models
 FAIL["test_name_should_be_present", UserTest, 2016-08-09 12:46:01 +0000]
 test_name_should_be_present#UserTest (1470746761.12s)
        Expected true to be nil or false
        test/models/user_test.rb:15:in `block in <class:UserTest>'
        :
2 tests, 2 assertions, 1 failures, 0 errors, 0 skips

失敗します。

Userモデルを下記のように修正。

app/models/user.rb

class User < ActiveRecord::Base
  validates :name, presence: true
end

validatesメソッドにpresence: trueという引数を与えて使うことで空にならないようにチェックができる。
(第2章の演習でやってたらしいけどすっかり忘れてた)

コンソール起動して云々はチュートリアルの本文読んで済ませる。
Railsコンソール使えば実際にUser作ったときの動作が見れる、ってことかな。

Userモデルを修正したのでテスト再実行。

$ bundle exec rake test:models
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips

問題なし。

name属性の次はemail属性の検証。
name属性と同じように下記テストコードを追加する。

test/models/user_test.rb

  test "email should be present" do
    @user.email = "     "
    assert_not @user.valid?
  end

テスト実行。

$ bundle exec rake test:models
3 tests, 3 assertions, 1 failures, 0 errors, 0 skips

email属性には何もバリデーションコード追加してないので失敗します。

これも同じようにバリデーションコードを追加。

app/models/user.rb

  validates :email, presence: true

テスト再実行。

$ bundle exec rake test:models
3 tests, 3 assertions, 0 failures, 0 errors, 0 skips

問題なし!

name属性とemail属性にどんな制約が必要か考えて追加する章ですね。
今日の作業時間は【31分】

次は「6.2.3 長さを検証する」から。