Rails 3.0 特定のフィールドのバリデーションのみ実行

とにかく Ruby も Rails も行き当たりばったり。
4 年前に Rails アプリを実装したはずなんだけど、歴史の修正力のせいか僕の記憶からすっぽりと抜け落ちていて、Ruby も Rails も初めて触るかのような新鮮さ。

class User

   validates :email,
    :presence => true,
    :email => true,
    :uniqueness => { :case_sensitive => false, :allow_blank => true }

  validates :password,
    :presence => true,
    :length => { :in => 8..32, :allow_blank => true },
    :confirmation => true

end

さて、こんなバリデーションルールを定義した User クラスがあったとして、ある場面でこの User オブジェクトのパスワードだけバリデートしたい。これは

User._validators[:password].each do |v|
  v.validate(@user)
end

unless @user.errors.empty?
  # パスワードのバリデーションエラーあり
end

といったコードで実現できたんだけど、User._validators[:password] 辺りがかなりグレーなコードに見える。

この逆に、特定のフィールドのバリデーションだけ除いて、@user.valid? とバリデーションを掛けたいケースも多いのだけど、どうにもうまいやり方が分からない。
今はレールからちょっと外れると、途端に動けなくなってしまう状態。Ruby にも Rails にも慣れてくれば、もうちょっと柔軟に動けるようになるんだろうけどね。

Last updated on July 8, 2015