Ruby on RailsのModelでのバリデーションはフォームなどで入力した値をシステムが許容できる値かをチェックするしくみです。バリデーションにより、DBに正しいデータを保存するように利用者をサポートします。
class Person < ActiveRecord::Base validates :name , presence: true end Person.create(name: "John Doe" ).valid? Person.create(name: nil ).valid?
🤔 バリデーションの実行タイミング create
、save
、update
メソッドなどで呼び出した際にバリデーションチェックして、DBへの保存を行います。また、valid?
メソッドを実行するとバリデーションを実行します。
🚜 主要なバリデーション ここではRailsの所要なバリデーションを紹介します。
指定したカラムが空でないことをチェック validates :name , presence: true validates :finished , inclusion: { in: [true , false ] }
DBのカラムにもnot null
制約をつけましょう。
指定した値のどれかなことをチェック validates :status , inclusion: { in: %w(draft publish private) }
指定したカラムがユニークであることをチェック validates :name , uniqueness: true validates :title , uniqueness: { scope: [:chapter ] }
DBのテーブルにもユニーク制約をつけましょう。
指定したカラムの文字数のチェック lengthで指定したカラムの文字数をチェックします。
validates :name , length: { minimum: 2 } validates :name , length: { maximum: 256 } validates :name , length: { in: 10 ..30 }
DBのカラムにも長さの制限を付けることで、効率的にデータを格納できます。
正規表現で値をチェック format
オプションを使うと、正規表現を使って指定した値をチェックできます。
メールアドレスのバリデーション validates :email , format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
URLのバリデーション validates :url , format: /\A
指定した数値であることをチェック validates :age , numericality: true
オプション
説明
only_integer
Integer(整数型)であることをチェック
greater_than
指定された値より大きいことをチェック
greater_than_or_equal_to
指定された値と等しい、あるいは大きいことをチェック
equal_to
指定された値と等しいことをチェック
less_than
指定された値よりも小さいことをチェック
less_than_or_equal_to
指定された値と等しい、あるいは小さいことをチェック
条件付きでバリデーションを行う if
オプションを付けること、特定の条件のときだけバリデーションを行います。
validates :content , :presence if: :published? def published? status == 'published' end
🐠 バリデーションのチェック結果を取得する バリデーションvalid?
か、保存メソッドsave
、create
などを実行して、バリデーションでエラーが出た場合はerrors[:attribute]
にエラーの内容が保持されています。
class Person < ActiveRecord::Base validates :name , presence: true , length: { minimum: 3 } end person = Person.create person.errors[:name ] person.errors.messages person.errors.full_messages
🐡 バリデーションをスキップする バリデーションを一時的に無視したい場合は次のように記述すると、バリデーションをスキップできます。
article.save!(validate: false )
🐮 オリジナルのバリデーションクラス:validates_with
validation_with
を使うとバリデーション専用の別のクラスにレコードを渡すことができます。
class Person < ActiveRecord::Base validates_with GoodnessValidator, field: %i[first_name last_name] end
class GoodnessValidator < ActiveModel::Validator def validate (record) if options[:fields ].any? { |field| record.send(field) == 'Evil' } record.errors[:base ] << 'これは悪人だ' end end end
👽 参考リンク
🖥 VULTRおすすめ
「VULTR 」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。
最近はVULTR のヘビーユーザーになので、「ここ 」から会員登録してもらえるとサービス開発が捗ります!