はじめてのRuby on Rails、トラブル記録
<< select_tagのオプションに配列を使う | TOP | gitでerror: error setting certificate verify locationsが出た場合の対処方法(Windows) >>
スポンサーサイト

一定期間更新がないため広告を表示しています

posted by スポンサードリンク | | - | - | - |はてなブックマーク - スポンサーサイト
Rails3でカスタムバリデーション
Rails3ではValidationがかなり変わりました。色々てこずったのだけど、さくっとできるナイスな手順を書いておきまーす。

 【1】Validation用のフォルダを作る

私はlibの下にvalidatorsフォルダを作りました。

 【2】validatorsフォルダを自動的に読み込むようにする。

config/application.rbに、以下の一行を追加します。
config.autoload_paths += %W(#{config.root}/lib/validators)

class Application < Rails::Applicationの中のコメント上から5行目あたりに書き方の見本があります。
そこに書けばよろしいかと。

【3】カスタムバリデーションを書く


クローバー validates_eachの場合
これは、フォームで年月だけを入力して、その入力された月が今月より前かどうかを判定するバリデーションです。

lib/validators/before_month_validator.rb
class BeforeMonthValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << 'must be before or equal to this month' if value.beginning_of_month >= Time.now.beginning_of_month.to_date
  end
end
Model
validates :since, :before_month => true

注意点
  • validates_eachの場合は、ActiveModel::EachValidatorになる。
  • モデルではファイル名からvalidatorを抜いた名前で呼べばいい。
それくらいしかないかも。validates_eachの方はめっちゃ簡単です!

クローバー validates_withの場合
lib/validators/different_from_validator.rb
class DifferentFromValidator < ActiveModel::Validator
  def validate(record)
    if record.send(options[:a]) == record.send(options[:b])
      record.errors[:base] << "#{options[:b]} must be different from #{options[:a]}"
    end
  end
end
Model
validates_with DifferentFromValidator, :a => :since, :b => :until

注意点
  • 複数の値を見るバリデーションはvalidates_withを使う。validates_eachでできないか挑戦したけどできず。
  • validates_withの場合はクラス名フルネームで呼ばなきゃいけない。
  • validates_withの場合はActiveModel::Validatorになる。
  • def validate(record)と(record)を入れる。
  • モデル側で「:hogehoge => :nantoka」と書いたオプションを「options[:hogehoge]」で値を取れる。
  • record.send(options[:a])で:aのvalueを取得。
    :a => :since / record.send(options[:a])だったら、Rails2.xだったらself.sinceと書いてるとこ。

self.hogehogeが使えなくて、どうやって値を取るのかかなり探してしまった……汗
バリデーションのファイル名は必ず「なんとかかんとか_validator」にしなければなりません。validatorついてなかったら読み込んでくれなかった。クラス名とファイル名も一致してないとだめだった。
たくさんのバリデーションを一つのファイルに書く方法はあるのかな?謎。

でも一回やり方わかってしまえば、シンプルに書けて使い回しできるのでとても便利!
Rails2.xの時にはかなりぐちゃぐちゃになりがちだったので、コードがすっきりしてうれしい楽しい
posted by トモト | 18:15 | Rails3.x | comments(0) | trackbacks(0) |はてなブックマーク - Rails3でカスタムバリデーション
スポンサーサイト
posted by スポンサードリンク | 18:15 | - | - | - |はてなブックマーク - スポンサーサイト
コメント
コメントする










この記事のトラックバックURL
http://hajimete-ruby.jugem.jp/trackback/69
トラックバック
Rails3レシピブック 190の技
Rails3レシピブック 190の技
ついにRails3対応版が出ました!!
WEB+DB PRESS Vol.58
WEB+DB PRESS Vol.58
Rails2系から3への移行時に知りたいことがひとまとまりになっててよかった!色々ググるよりこれを読む方が早い。
Rubyレシピブック 第3版 303の技
Rubyレシピブック 第3版 303の技
Rubyやるならこのリファレンスは必要。
Search this site