【44日目】【1日20分のRailsチュートリアル】【第6章】ユーザーの有効性と存在性の検証
今日は「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 長さを検証する」から。