プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Ruby on Rails3、独自validationを定義する(2) 複数の項目の値に対して独自validate
独自validationを定義する(1) ひとつの項目の値に対して独自validate」では
ひとつの項目に対してのチェックでしたが、
複数の項目を同時にチェックしたい場合もあるじゃないですか。
項目Aと項目Bが両方からだったらNGとか開始日が終了日より後だったらNGとか。

そんな場合の独自validationの定義方法です(--)b

基本的な流れは

1.「ActiveModel::Validator」を継承したclassを作る

2.作成したclass内で「validate」メソッドを定義する

3.モデルから該当のクラスを呼び出す(validates_with)

です。

取りあえずこちらのコードをご覧くださいφ(--)

■hoge2_validator.rb
  class Hoge2Validator < ActiveModel::Validator
    def validate(record)
      if record.send(options[:val1]) == "" && record.send(options[:val2]) == ""
        record.errors[:base] << "両方空だよ"
      end
    end
  end
  
  #実は複数classが書けたりする
  class Hoge3Validator < ActiveModel::Validator
    def validate(record)
      if record.send(options[:val1]) == "" && record.send(options[:val2]) == ""
        record.errors[:base] << "両方空だよ2"
      end
    end
  end

■app/models/hoge.rb
  # -*- encoding: UTF-8 -*-
  
  class Hoge < ActiveRecord::Base
      attr_accessible :aaa,bbb
  
      validates_with Hoge2Validator, :val1 => :aaa, :val2 => :bbb
      validates_with Hoge3Validator, :val1 => :aaa, :val2 => :bbb
  end

まず「ActiveModel::Validator」を継承したクラスHoge2Validatorを
作成します。
このときのファイル名は「hoge2_validator.rb」です。
※クラス名とファイル名の対応が取れて入れば
 最後が「Validator(_validator.rb)」でなくてもOK

ほんで作成したクラス内で「validate」メソッドを定義します。
ここで定義した処理がチェックロジックの中身です。
細かい説明は省略しますがサンプルではval1とval2が両方空だったら
エラーメッセージを:baseに突っ込んでいますよ。

あとは呼出側のモデルで呼び出すだけですが
今回の実装方式では「validates_with」でクラス名を指定して呼び出します。

  validates_with Hoge2Validator, :val1 => :aaa, :val2 => :bbb

のところですね。
クラス名以降のオプションは引数代わりです。
「:val1 => :aaa」とか書いてありますが
「aaaがval1ってことでよろすく(--)ノ」な意味です。
「options[:val1]」と記述することでメソッド内から
「:aaa」を参照できるようになります。
同様に「:val2 => :bbb」は「bbbがval2ね(--)ノ」です。
オプションをいじることで好きな値をメソッドに渡せるので
後は好きにチェックロジックを実装してください。

完成\(--)/

ちなみにこの書き方の場合、複数のクラスを一つのファイルにまとめるのも
その気になればできたりします(-。-)ぼそっ

一番上で定義したクラス名とファイル名が一致していれば
下にずらずらっと他のクラスも定義できる感じ。
ただ個人的にはやらない方が良いと思いますけどね。
管理し難くなるので。

Ruby on Rails3、独自validationを定義する(1) ひとつの項目の値に対して独自validate
・Ruby on Rails3、独自validationを定義する(2) 複数の項目の値に対して独自validate
Ruby on Rails3、独自validationを定義する(3) 独自validateファイルの置き場所
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:Ruby on Rails  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事