From bd0f86699aecf2233946cf08159364fb9bff6c1c Mon Sep 17 00:00:00 2001 From: miloops Date: Tue, 16 Sep 2008 11:14:23 -0300 Subject: [PATCH] validate_length_of should use custom message if given when using in or within. --- activerecord/lib/active_record/validations.rb | 11 +++++------ activerecord/test/cases/validations_test.rb | 13 +++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index 518b59e..dd1f218 100644 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -574,7 +574,9 @@ module ActiveRecord # Get range option and value. option = range_options.first option_value = options[range_options.first] - + key = {:is => :wrong_length, :minimum => :too_short, :maximum => :too_long}[option] + custom_message = options[:message] || options[key] + case option when :within, :in raise ArgumentError, ":#{option} must be a Range" unless option_value.is_a?(Range) @@ -582,9 +584,9 @@ module ActiveRecord validates_each(attrs, options) do |record, attr, value| value = options[:tokenizer].call(value) if value.kind_of?(String) if value.nil? or value.size < option_value.begin - record.errors.add(attr, :too_short, :default => options[:too_short], :count => option_value.begin) + record.errors.add(attr, :too_short, :default => custom_message || options[:too_short], :count => option_value.begin) elsif value.size > option_value.end - record.errors.add(attr, :too_long, :default => options[:too_long], :count => option_value.end) + record.errors.add(attr, :too_long, :default => custom_message || options[:too_long], :count => option_value.end) end end when :is, :minimum, :maximum @@ -592,13 +594,10 @@ module ActiveRecord # Declare different validations per option. validity_checks = { :is => "==", :minimum => ">=", :maximum => "<=" } - message_options = { :is => :wrong_length, :minimum => :too_short, :maximum => :too_long } validates_each(attrs, options) do |record, attr, value| value = options[:tokenizer].call(value) if value.kind_of?(String) unless !value.nil? and value.size.method(validity_checks[option])[option_value] - key = message_options[option] - custom_message = options[:message] || options[key] record.errors.add(attr, key, :default => custom_message, :count => option_value) end end diff --git a/activerecord/test/cases/validations_test.rb b/activerecord/test/cases/validations_test.rb index c049659..78ed1aa 100644 --- a/activerecord/test/cases/validations_test.rb +++ b/activerecord/test/cases/validations_test.rb @@ -949,6 +949,19 @@ class ValidationsTest < ActiveRecord::TestCase assert_equal "boo 5", t.errors["title"] end + def test_validates_length_of_custom_errors_for_in + Topic.validates_length_of(:title, :in => 10..20, :message => "hoo {{count}}") + t = Topic.create("title" => "uhohuhoh", "content" => "whatever") + assert !t.valid? + assert t.errors.on(:title) + assert_equal "hoo 10", t.errors["title"] + + t = Topic.create("title" => "uhohuhohuhohuhohuhohuhohuhohuhoh", "content" => "whatever") + assert !t.valid? + assert t.errors.on(:title) + assert_equal "hoo 20", t.errors["title"] + end + def test_validates_length_of_custom_errors_for_maximum_with_too_long Topic.validates_length_of( :title, :maximum=>5, :too_long=>"hoo {{count}}" ) t = Topic.create("title" => "uhohuhoh", "content" => "whatever") -- 1.5.5.1