SakuraWi - BLog

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

validatorクラスについて


Rails Tutorial終了後、validatorクラスを試してみた記録
ファイル名やコード内容はRails Tutorialで使ったものを参考にしてください。

validatorクラスを作ってみた。

基本的な考えは、railsの仕様にないvalidationを作る際に用いるものです。
カスタムバリデーションともいいます。

ということで、user.rbの中身を書き換えます。
formatの部分だけをvalidationしたいため、コメントアウトしてみました。

そして、validationするためのクラスを呼ぶには、
validates_with クラス名のように呼びます。

#VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    #format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }

  validates_with EmailValidator

lib/validates/email_validator.rbを作ります。

class EmailValidator < ActiveModel::Validator
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  def validate(user)
    if invalid_email(user.email)
      user.errors.add(:base, "invalid")
    end
  end

  private
    def invalid_email(email)
      return true unless email.match(VALID_EMAIL_REGEX)
    end
end

続きまして、

注意事項

クラス名はclass EmailValidatorに合わせて
email_validator.rbにする。

スネークケースを適用させたものを名前にすること。

配置について

配置については、
lib/validates

app/validates
のように、validatesディレクトリを作成するケースが多いようです。

lib/validatesに作るのがスマートかもしれません。

lib/validatesのように作った場合、
config/application.rbに1行追加します。

module Railstutorial
  class Application < Rails::Application
    config.action_view.embed_authenticity_token_in_remote_forms = true

    config.autoload_paths += %W(#{config.root}/lib/validates)

最下行の1行が必要になります。
app/配下であれば、自動で読み込みがされるようですが、libは読み込みを明示しなければならないようです。

参考記事

ActiveModel::Validator

具体的な方法で書いてしまいましたが、使用例の1つとして残します!