lib/active_model/validations/confirmation.rb in activemodel-3.0.0.beta4 vs lib/active_model/validations/confirmation.rb in activemodel-3.0.pre

- old
+ new

@@ -1,20 +1,8 @@ module ActiveModel module Validations - class ConfirmationValidator < EachValidator - def validate_each(record, attribute, value) - confirmed = record.send(:"#{attribute}_confirmation") - return if confirmed.nil? || value == confirmed - record.errors.add(attribute, :confirmation, :default => options[:message]) - end - - def setup(klass) - klass.send(:attr_accessor, *attributes.map { |attribute| :"#{attribute}_confirmation" }) - end - end - - module HelperMethods + module ClassMethods # Encapsulates the pattern of wanting to validate a password or email address field with a confirmation. Example: # # Model: # class Person < ActiveRecord::Base # validates_confirmation_of :user_name, :password @@ -40,10 +28,18 @@ # method, proc or string should return or evaluate to a true or false value. # * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should # not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The # method, proc or string should return or evaluate to a true or false value. def validates_confirmation_of(*attr_names) - validates_with ConfirmationValidator, _merge_attributes(attr_names) + configuration = attr_names.extract_options! + + attr_accessor(*(attr_names.map { |n| "#{n}_confirmation" })) + + validates_each(attr_names, configuration) do |record, attr_name, value| + unless record.send("#{attr_name}_confirmation").nil? or value == record.send("#{attr_name}_confirmation") + record.errors.add(attr_name, :confirmation, :default => configuration[:message]) + end + end end end end end