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を薄くしていきましょう。