lengthのバリデーションをかけてみる。
validates :name, {presence: true, length: { in: 1..10 }}
空で送信してみた。
Name can't be blank
Name is too short (minimum is 1 character)
というメッセージが表示された。
11以上で送信してみる。
Name is too long (maximum is 10 characters)
というメッセージが表示された。
気づき
これだけでバリデーションが掛けられている。ことがわかった。
バリデーションにメッセージオプションをつけてみる
validates :name, {presence: true, length: { in: 1..10, message: "1文字以上から10文字以下で入力してください。"}}
Name 1文字以上から10文字以下で入力してください。
と表示された。
属性名が表示されたようだ。これを表示しないようにしたい。
validate :name_is_present
private
# Making this private is optional, but recommended
def name_is_present
errors.add(:base, "Promo code required") if name.blank?
end
.
.
.
validate :promo_require
def promo_require
errors.add(:base, 'promo code required') unless name.present?
end
出典
気づき
どうやらerrors.add
を使うようだ。
7.4 errors.add
addメソッドを使って、特定の属性に関連するエラーメッセージを手動で追加できます。このメソッドは、属性とエラーメッセージを引数として受け取ります。
class Person < ApplicationRecord
validate do |person|
errors.add :name, :too_plain, message: "はあまりクールじゃない"
end
end
irb> person = Person.create
irb> person.errors.where(:name).first.type
=> :too_plain
irb> person.errors.where(:name).first.full_message
=> "Nameはあまりクールじゃない"
出典
:too_plain
とは?
irb(main):001:0> user = User.create
TRANSACTION (0.2ms) BEGIN
TRANSACTION (2.1ms) SAVEPOINT active_record_1
User Exists? (1.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` IS NULL LIMIT 1
TRANSACTION (2.5ms) ROLLBACK TO SAVEPOINT active_record_1
=>
#<User:0x000000011594d5e8
...
irb(main):002:0> user.errors.where(:name).first.type
=> :blank
irb(main):004:0> user = User.create(name:"aaaaaaaaaaaa")
TRANSACTION (0.2ms) SAVEPOINT active_record_1
User Exists? (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` IS NULL LIMIT 1
TRANSACTION (0.2ms) ROLLBACK TO SAVEPOINT active_record_1
=>
#<User:0x0000000115cc40f0
...
irb(main):005:0> user.errors.where(:name).first.type
=> :too_long
気づき
- 属性が空だと
:blank
- 制限を超えていると
:too_long
が表示されるのか
エラーの原因の型があるのか。
エラーメッセージの最初の属性名を消す
しかしこれであっているかはわからない。が消すことだけ
はできた。
config/locales/en.yml
かconfig/locales/ja.yml
.
.
.
ja:
errors:
format:
"%{message}"
出典
validate :name_is_present
private
# Making this private is optional, but recommended
def name_is_present
errors.add(:base, "Promo code required") if name.blank?
end
これを真似するといつでもこのエラーメッセージが発生してしまう。
まだ自分の検証が足りないのかもしれない。
属性名が最初に入る理由はerrors.add
の仕様
属性とエラーメッセージを引数として受け取ります。
なので属性が先頭に来る。
出典
検索
バリデーション メッセージ 属性名 rails