2011年9月25日日曜日

rails3.0の頃からvalidationにコンテキストを指定できる様になってた

■概要

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
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
おぉ!いい感じにcontextを意識できてますね!
ソースを読むとコンテキスト未指定時は、新規なら:create、更新なら:updateをコンテキストとして採用しており、過去との互換性を維持しているという事がわかりました。

■雑感

https://github.com/rails/rails/commit/5c245b91d2dbc0b300e8193310b3f950d0cf6c4b#activerecord/lib/active_record/validations.rb
で追加されてました。2010/05/10に追加された様です。

0 件のコメント:

コメントを投稿