Help us understand the problem. What is going on with this article?

カスタムバリデートでバリデーション後編 初心者→中級者へのSTEP4/25

More than 1 year has passed since last update.

カスタムバリデートでバリデーション後編

はじめに
はい、後編です。前回はこちら
自己満で書いてたら、意外と見てくれている人がいて恐縮です。頑張ります。ンゴンゴ!
では今回は、レコードの複数の属性をバリデートするカスタムバリデーションを説明。

レコードの複数属性に対するカスタムバリデーション

前回は個別ということでEachValidatorを継承しましたが、今回はValidatorを継承する方法をご説明。

ケース説明

今回は例として、プレミアム会員と、通常会員の場合でかけるべきバリデーションが違う時を考えます。
プレミアム会員様は100文字まで自己紹介文をかけますが、通常会員の財布の紐が硬い方は10文字でしか自己紹介ができないようにします。

Userモデル

User.rb
class User < ApplicationRecord
  enum status: {
    normal:  0, #通常会員
    premium: 1, #プレミアム会員
  }
  include ActiveModel::Validations
  validates_with UserValidator
end

enumで会員の状態を把握してます。statusnormalpremiumかでかけるバリデーションを分岐させます。もちろんこれはUser.rbに書いても機能します。ですが、その様な条件がどんどん増えてくとUser.rbがおデブちゃんになってしまいます。痩せさせたいですよね?では、結果にコミットしましょう。

てな訳でバリデーションルールは上述コードを見る通り、UserValidatorに書きます。
validates_withによって呼び出されてます。(validates_withはActiveModel::Validationsをインクルードせんと使えないですのでインクルードしてください。)

app/validators/user_validator.rb
class UserValidator < ActiveModel::Validator

  def validate(record)
    if record.status == 'normal' && record.description.length > 10
      record.errors[:description] << '通常会員は10文字以内で自己紹介してください。'
    elsif record.status == 'premium' && record.description.length > 100
      record.errors[:description] << 'プレミアム会員は100文字以内で自己紹介してください。'
    end
  end

end

if文が汚い...
ですが、これでモデルはスッキリのままバリデーションがかけました。
前回の記事では個別の属性にバリデーションをかける時のカスタムバリデートを説明しましたが、今回も属性1つじゃねえか!!という方、はい。少しケースがわかりづらかったカモです。ごめんなさい。今回の方法はレコードの複数属性にかけるバリデーションを記述するということを意識してください。全ての属性にvalidate_each書いて検証するのはめんどくさいですよね?ですからまとまったバリデーションはここに書いてmodelはスッキリさせましょうということです。

まとめ

具体例のしょぼさが経験のなさを物語ってますね。頑張ります。明日は今回登場したenumについてご説明します。
便利です。頑張ります。

参考にしたの

Active Record バリデーション
https://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF

【パーフェクトRails】バリデーションをクラスに分離する
https://waterlow2013.hatenablog.com/entry/2016/10/11/011312

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away