脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

Railsのモデル側でのvalidation

Railsのモデルファイルでのvalidationの方法です。

validateの対象を指定

validateを行うパラメータをvalidatesを使って宣言する
class TestValidates < ActiveRecord::Base

  validates :param1
  validates :param2
  validates :param3
・
・
・
end

validateの条件の設定

存在チェック
class TestValidates < ActiveRecord::Base

  validates :param1, presence: true
・
・
・
end
検証をスキップする場合

値が送られた場合のみvalidationを行いたい場合などは、以下を使う

class TestValidates < ActiveRecord::Base

  validates :param1, allow_nil: true # nilの検証をスキップする
  validates :param2, allow_brank: true # 空の検証をスキップする
・
・
・
end
lengthチェック
class TestValidates < ActiveRecord::Base

  validates :param1, :length => { :is => 1 }  # 文字の長さが1byte
  validates :param2, :length => { :minimum => 5, :maximum => 10 }  # 文字の長さが5byte以上、10byte以下じ)
  validates :param3, :length => { :in => 5..10 } # 上記と同じ
・
・
・
end
数値チェック
class TestValidates < ActiveRecord::Base

  validates :param1, :numericality => { :only_interger => true }  # 数字のみで構成されているか
  validates :param2, :numericality => { :greater_than => 5 }      # 数字が5より大きいか
  validates :param3, :numericality => { :greater_than_or_equal_to => 5 }  # 数字が5以上であるか
  validates :param4, :numericality => { :less_than => 5 } # 数字が5より小さいか
  validates :param5, :numericality => { :less_than_or_equal_to => 5 }     # 数字が5以下であるか
  validates :param6, :numericality => { :equal_to => 5 }  # 数字が5と等しいか
  validates :param5, :numericality => { :odd => true }    # 数字が奇数か
  validates :param6, :numericality => { :even => true }   # 数字が偶数か
・
・
・
end

エラーメッセージの設定

  • validationに失敗した際のエラーメッセージを設定します
  • 条件毎に異なるメッセージを設定することも出来ます
class TestValidates < ActiveRecord::Base

  validates :param1, :length => { :is => 1, :message => '入力された文字が1byteではありません' }
  validates :param2,
            :numericality => {
              :greater_than_or_equal_to => 5,
              :less_than_or_equal_to => 10,
              :message => '入力値が5~10の範囲外です' 
           }
  validates :param3,
            :length => {
              :is => 5,
              :message => '入力値が1byteより大きいです'
          },
            :numericality => {
              :odd => true,
              :message => '入力値が奇数ではありません' 
           }           
・
・
・
end

validationの利用

  • controllerファイルなどで以下のように記述すれば使用可能
initialize処理が必要ない場合
${モデル名}.new(${key} => ${value})
TestValidates.new(param1 => 'hogehoge')
initialize処理が必要な場合
  • modelファイルのinitializeに以下のように書き足し、上記と同じくnewで呼び出せばよい
class TestValidates < ActiveRecord::Base
・
・
・
  def initialize(params = nil)
    super(params)
    ${追加したい処理}
  end
end

validationの結果の利用

${変数} = ${モデル名}.new(${key} => ${value})
${変数}.valid? # validationをpassした場合はtrue、失敗した場合はfalseを返す
${変数}.invalid? #上記の逆
test = TestValidates.new(param1 => 'hogehoge')
test.valid?   # true
test.invalid? # false