0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

rails 条件付きでバリデーションを効かせる

Posted at

#こういうときはバリデーション効かせないで欲しい
ってときの対応。

通常のバリデーションは以下の感じ


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カラムに値が入っていないときは通常のログインとみなしてバリデーションを効かせたい。」時

ifunlessで条件を指定して、目的の項目へ追加する。


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

とりあえず、こんなけ。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?