SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

Ruby on Railsガイドを読み進める - validation


Active Record まわり

2.1 acceptance

チェックボックス専用のバリデーション 複数個だとどうなるだろ?

2.2 validates_associated

アソシエーションを張っているものを一緒にバリデーションしてくれる便利くん

validates_associatedは関連付けの両側のオブジェクトでは実行しないでください。 関連付けの両側でこのヘルパーを使用すると無限ループになります。

なんだか物騒なことが書いていた。一方通行で。

2.5 format

マッチするかどうか

2.7 length

length { in: 6..10 }のような範囲指定 is: は一致のバリデーション

2.11 uniqueness

scope: 2つの属性に対して行われる uniqueness: { case_sensitive: false } 大文字小文字の区別をなくす

validates_withとvalidates_each

withだと一つのフィールドにおけるチェックするバリデーションクラスを作成。 validation専用のクラスにレコードを渡す eachではインスタンスに対するレコード、属性、値を渡して個々にチェックすることができます。

と書いてからいろいろ調べてみると validatorの方は複雑なvalidationのとき、 1つのフィールドに対するvalidationをさせたいときはEachvalidatorなんだとか。

まるまる各属性もっていきたい場合はvalidates_with
1つの属性で行う場合は

呼び出し方

class Person
  include ActiveModel::Validations
  validates_with MyValidator
end
class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end

の違い

3.4 :on

validationを行うタイミングを指定できる

5.2 :ifや:unlessでProcを使用する

Procを使用すると新しいメソッドを定義することなく条件を記述することが可能

if:

validates :phone, presence: true, if: :aaa

def aaa
   x == "aaa"
end

errorsの追加

errors[:base] << "この人物は以下の理由で無効です..." [:base]は配列でメッセージを保存する

参考

Railsバリデーションまとめ - Qiita

【パーフェクトRails】バリデーションをクラスに分離する - ITの勉強をいろいろやってみたブログ