0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsチュートリアル第6章 長さを検証する

Posted at

###長さを検証する
各ユーザーは、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"]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?