####Userモデルのname,emailカラムにバリデーションを設定
Railsガイドなどを参考にしています。
https://railsguides.jp/active_record_validations.html
【やりたいこと】
・名前やメールアドレスは空欄で登録できないようにする
・名前とメールアドレスの文字数制限
ポイントは
①"presence: true"→空欄での登録を禁止する
②"length: { maximum: }" → ":"の後ろに設定した数字以上の長さを禁止する
app/models/user.rb ファイルでの作業になります。
作成したのは下記のコード。
class User < ApplicationRecord
validates :name, presence: true, length: { maximum: 20 }
validates :email, presence: true, length: { maximum: 300 },
end
うまくいっているか、Rails consoleで確認してみる。まずは空欄で登録しようとすると。。。
> User.create(name: "", email: "")
(0.3ms) BEGIN
(0.4ms) ROLLBACK
=> #<User id: nil, name: "", email: "", created_at: nil, updated_at: nil>
ROLLBACKして登録されていません。
そして長い名前やメールアドレスを登録しようとしてみると、これもROLLBACKしていることが分かります(email欄の...となっている部分はあまりに長いので記事での表示を省略しています)。
> user = User.create(name: "a"*25 , email: "b"*350 + "@test.com")
> (0.3ms) BEGIN
> (0.4ms) ROLLBACK
=> #<User:
id: nil,
name: "aaaaaaaaaaaaaaaaaaaaaaaaa",
email:"aaaaaaaaaaaaaaaaaaaaaaaaa...@test.com",
created_at: nil,
updated_at: nil>
エラーの理由を表示すると。。。
> user.errors.messages
> {:name=>["is too long (maximum is 20 characters)"],
:email=>["is too long (maximum is 300 characters)"]}
"length: { maximum: }"がちゃんと機能していることが確認できました。
ちなみにmaximumとなっている部分は、いろいろ応用して使えるようです。
(下記Railsガイドより)
class Person < ApplicationRecord
validates :name, length: { minimum: 2 }
validates :bio, length: { maximum: 500 }
validates :password, length: { in: 6..20 }
validates :registration_number, length: { is: 6 }
end
:minimum: 属性はこの値より小さな値を取れません。
:maximum: 属性はこの値より大きな値を取れません。
:inまたは:within: 属性の長さは、与えられた区間以内でなければなりません。このオプションの値は範囲でなければなりません。
:is: 属性の長さは与えられた値と等しくなければなりません。