2
1

More than 1 year has passed since last update.

モデルの属性にバリデーションをかける

Posted at

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.ymlconfig/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

2
1
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
2
1