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は読み込みを明示しなければならないようです。
参考記事
具体的な方法で書いてしまいましたが、使用例の1つとして残します!