railsで独自のカスタムvalidationを作る

validationって意外に簡単に作ることができます。

controllerに書いていた、正規表現の入力チェックなどは、validationにしましょう。

こういうのをcontrollerに書くことで、controllerがどんどん重くなっていきます。

モデルの役割は検証もあるので、バンバン作っちゃいましょう。

作成方法

例えば、emailで正規表現でvalidationをしたいということがあったとします。

valid_address = /\A[a-zA-Z0-9_\#!$%&`'*+\-{|}~^\/=?\.]+@[a-zA-Z0-9][a-zA-Z0-9\.-]+\z/

こういうのをUsercontrollerに書いていたとします。

def create
  email = params[:user][:email]
  unless email =~ valid_address
  ...
  end
end

Userモデルです。

class User < ActiveRecord::Base
  validates :email, presence: true, ...  ←ここに新しいvalidationを加える
end

app/models/validators/email_validator.rb

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A[a-zA-Z0-9_\#!$%&`'*+\-{|}~^\/=?\.]+@[a-zA-Z0-9][a-zA-Z0-9\.-]+\z/
      record.errors.add[attribute] << '正しいアドレスを入れてください'
    end
  end
end

ここのclass EmailValidator < ActiveModel::EachValidatorはvalidationをするフィールドに対して行います。 今回の場合は、emailに対して行います。 モデル全体のvalidationをしたい場合は、また別の方法になります。 今回は、emailに対してのみ行いたいので、こうしました。

これでvalidationを加えることができたので、こうします。

class User < ActiveRecord::Base
  validates :email, presence: true, email: true
end

これでcontrollerのunless文が消せます。

まとめ

検証系の仕事はvalidationに振っていきましょう。

その際のvalidationがないのなら、自分で作ってしまえばいいです。

controllerを薄くしていきましょう。