hackugyo (Double strike)

2011-10-31

Sexy Validationは実際どうなってるのか

Rails3.0ではSexy Validationという機能があって,

class Article < ActiveRecord::Base
	validates( :title, {:presence => true} )
	# validates_presence_of :title
	# と同等
end

と書ける.これは,2つ以上のフィールドに対し適用したい場合に,

class Article < ActiveRecord::Base
	validates( :title, body, {:presence => true} )
	# validates( :title, {:presence => true} )
	# validates( :title, {:presence => true} )
	# と同等
end

と書ける.おそらく,validatesメソッド引数は(*field, name_params_hash)となっているのでしょう.

Ruby 1.9 では可変長引数よりも後にまだ通常の引数を置くことができます。



が,話はそう単純ではなさそう.というのも,独自validationを定義するときは,
Sexy Validationで独自のValidationを - takkan_mのNo planな日常にあるように,以下ようにEachValidatorの子クラスを定義することになるからです.

class NgWordValidator < ActiveModel::EachValidator
   def validate_each(record, attribute, value)
      record.errors[attribute] << 'include ng word' if value =~ /NG WORD/
   end
end

これで利用側では

class Post < ActiveRecord::Base
   validates :title, :presence => true, :ng_word => true
end

で利用できるというのですからおそろしい.つまりNgWordValidatorを:ng_wordキーで呼べているわけです.
なお,引数の(record, attribute, value)はそれぞれ,
record : 検証ルールを記述したクラス(ここではPostクラス)のヴァリデートされるインスタンス
attribute : 検証されるフィールド名のシンボル(ここでは:title)
value : record.attributeで返る,attributeの値
となっています.クラスとそのインスタンス変数へのアクセサとその値を入れたらtrue / falseが返る関数になっていればいいわけですね.

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/hackugyo/20111031/1320072919
リンク元