■概要
railsは従来modelで入力チェックを行ってました。#saveメソッドを呼び出し時に、#valid?メソッドが呼び出される事により、入力チェックを行っている人が多いのでは無いでしょうか?ただし、この仕様は、たまに上手く行かない時があり、「XXという画面ではYYの入力チェックだけしたい」というニーズに答えるにはあまり良い方法がありませんでした(泥臭い方法で解決する)。
ところが、先日railsのソースを読んでいると
activerecord-3.1.0/lib/active_record/validations.rb
def valid?(context = nil) context ||= (new_record? ? :create : :update) output = super(context) errors.empty? && output endとcontextが引数に渡せる仕様になってるので早速試してみました。
■検証
実験用のPostモデルを下記の用にしました。class Post < ActiveRecord::Base validates_presence_of :title, :on => :bar endでrails cで動かしてみました。
$ rails c Loading development environment (Rails 3.1.0) ruby-1.9.2-p180 :001 > post = Post.newおぉ!いい感じにcontextを意識できてますね!ruby-1.9.2-p180 :002 > post.valid?(:bar) => false ruby-1.9.2-p180 :003 > post.valid?(:foo) => true ruby-1.9.2-p180 :004 > post.save(:context => :bar) => false ruby-1.9.2-p180 :005 > post.save(:context => :foo) SQL (46.0ms) INSERT INTO "posts" ("created_at", "title", "updated_at") VALUES (?, ?, ?) [["created_at", Sat, 24 Sep 2011 18:03:18 UTC +00:00], ["title", nil], ["updated_at", Sat, 24 Sep 2011 18:03:18 UTC +00:00]] => true
ソースを読むとコンテキスト未指定時は、新規なら:create、更新なら:updateをコンテキストとして採用しており、過去との互換性を維持しているという事がわかりました。
■雑感
https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rbで追加されてました。2010/05/10に追加された様です。
0 件のコメント:
コメントを投稿