#こういうときはバリデーション効かせないで欲しい
ってときの対応。
通常のバリデーションは以下の感じ
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, length: {maximum: 255},
uniqueness: { case_sensitive: false}
validates :password, presence: true, confirmation: true
has_many :questions
#どういう状況で使う?
例えばSNSログインの場合、twitterでやろうとするとemailの値が取得できない(2019/08/10現在)のでバリデーションが効くとエラーになる。。。
###⇨「SNSログインの際に取得するuidカラムに値が入っていないときは通常のログインとみなしてバリデーションを効かせたい。」時
if
やunless
で条件を指定して、目的の項目へ追加する。
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, length: {maximum: 255},
uniqueness: { case_sensitive: false}, unless: :uid? #email取れないからこんな感じ
validates :password, length: {minimum: 6}, presence: true, confirmation: true, unless: :uid? #パスワードもSNSログインと別管理ならこんな感じ
has_many :questions
#callbackに対しても指定可能
以下はバリデーション用のヘルパーを定義してそのヘルパーの中でunless
を使い処理をするかしないかを判定している。
class User < ApplicationRecord
validates :name, presence: true, length: {maximum: 50}
#以下でヘルパーを呼び出す
before_save :email_downcase
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: {maximum: 255},
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false}, unless: :uid? #こんな感じ
validates :password, length: {minimum: 6}, presence: true, confirmation: true, unless: :uid?
has_many :questions
#email用にヘルパーを定義
def email_downcase
unless uid?
self.email.downcase!
end
end
とりあえず、こんなけ。