###長さを検証する
各ユーザーは、Userモデル上に名前を持つことを強制されるようになりました。
存在性の有効 valid?
しかし、これだけでは十分ではありません
。
ユーザーの名前はサンプルWebサイトに表示されるものなので、名前の長さにも制限
を与える必要があります。
最長のユーザー名の長さを単に50を上限として手頃な値を使うことにします。
つまりここでは、51文字の名前は長すぎることを検証します。
問題になる可能性もあるので長すぎるメールアドレスに対してもバリデーション
を掛けましょう。
ほとんどのデータベースでは文字列の上限を255としているので、それに合わせて255文字を上限とします。
説明するメールアドレスのフォーマットに関するバリデーションでは、こういった長さの検証はできないので、本節で長さに関するバリデーションを事前に追加
しておきます。
####nameとemailの長さの検証に対するテスト
>> "a" * 51
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>> ("a" * 51).length
=> 51
>> "a" * 244 + "@example.com"
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a@example.com"
>> ("a" * 244 + "@example.com").length
=> 256
テスト
buntu:~/environment/sample_app (modeling-users) $ rails test
Running via Spring preloader in process 10002
Started with run options --seed 29700
FAIL["test_name_should_not_be_too_long", #<Minitest::Reporters::Suite:0x0000559e8fb92520 @name="UserTest">, 1.5510990120001225]
test_name_should_not_be_too_long#UserTest (1.55s)
Expected true to be nil or false
test/models/user_test.rb:25:in `block in <class:UserTest>'
FAIL["test_email_should_not_be_too_long", #<Minitest::Reporters::Suite:0x0000559e8fba8c08 @name="UserTest">, 1.5563912540001184]
test_email_should_not_be_too_long#UserTest (1.56s)
Expected true to be nil or false
test/models/user_test.rb:31:in `block in <class:UserTest>'
13/13: [============================] 100% Time: 00:00:01, Time: 00:00:01
Finished in 1.55965s
13 tests, 24 assertions, 2 failures, 0 errors, 0 skips
Expected true to be nil or false
tureになって欲しいが、nilかfalseだった。
####name属性に長さの検証を追加する
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 50 }
#属性はname,属性の存在を検証、 最大50字まで
validates :email, presence: true, length: { maximum: 255 }
#最大255字まで
end
ubuntu:~/environment/sample_app (modeling-users) $ rails t
Running via Spring preloader in process 3042
Started with run options --seed 12529
13/13: [============================] 100% Time: 00:00:01, Time: 00:00:01
Finished in 1.86197s
13 tests, 24 assertions, 0 failures, 0 errors, 0 skips
####演習
1.長すぎるnameとemail属性を持ったuserオブジェクトを生成し、有効でないことを確認してみましょう。
>> user = User.new(name: "", email: " ")
(0.1ms) begin transaction
=> #<User id: nil, name: "", email: " ", created_at: nil, updated_at: nil>
>> user.valid?
=> false
2.長さに関するバリデーションが失敗した時、どんなエラーメッセージが生成されるでしょうか? 確認してみてください。
>> user.errors.full_messages
=> ["Name can't be blank", "Email can't be blank"]