Skip to content

Commit f975a86

Browse files
committed
Merge pull request rails#5942 from bcardarella/confirmation_error_message_on_confirmation_attribute
confirmation validation error attribute
2 parents 55fefdb + 4433b1a commit f975a86

File tree

7 files changed

+38
-11
lines changed

7 files changed

+38
-11
lines changed

activemodel/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## Rails 4.0.0 (unreleased) ##
22

3+
* `ConfirmationValidator` error messages will attach to `:#{attribute}_confirmation` instead of `attribute` *Brian Cardarella*
4+
35
* Added ActiveModel::Model, a mixin to make Ruby objects work with AP out of box *Guillermo Iguaran*
46

57
* `AM::Errors#to_json`: support `:full_messages` parameter *Bogdan Gusiev*

activemodel/lib/active_model/locale/en.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ en:
99
inclusion: "is not included in the list"
1010
exclusion: "is reserved"
1111
invalid: "is invalid"
12-
confirmation: "doesn't match confirmation"
12+
confirmation: "doesn't match %{attribute}"
1313
accepted: "must be accepted"
1414
empty: "can't be empty"
1515
blank: "can't be blank"

activemodel/lib/active_model/validations/confirmation.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ module Validations
55
class ConfirmationValidator < EachValidator
66
def validate_each(record, attribute, value)
77
if (confirmed = record.send("#{attribute}_confirmation")) && (value != confirmed)
8-
record.errors.add(attribute, :confirmation, options)
8+
human_attribute_name = record.class.human_attribute_name(attribute)
9+
record.errors.add(:"#{attribute}_confirmation", :confirmation, options.merge(:attribute => human_attribute_name))
910
end
1011
end
1112

activemodel/test/cases/validations/confirmation_validation_test.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,31 @@ def test_validates_confirmation_of_for_ruby_class
4444
p.karma_confirmation = "None"
4545
assert p.invalid?
4646

47-
assert_equal ["doesn't match confirmation"], p.errors[:karma]
47+
assert_equal ["doesn't match Karma"], p.errors[:karma_confirmation]
4848

4949
p.karma = "None"
5050
assert p.valid?
5151
ensure
5252
Person.reset_callbacks(:validate)
5353
end
5454

55+
def test_title_confirmation_with_i18n_attribute
56+
@old_load_path, @old_backend = I18n.load_path.dup, I18n.backend
57+
I18n.load_path.clear
58+
I18n.backend = I18n::Backend::Simple.new
59+
I18n.backend.store_translations('en', {
60+
:errors => {:messages => {:confirmation => "doesn't match %{attribute}"}},
61+
:activemodel => {:attributes => {:topic => {:title => 'Test Title'}}}
62+
})
63+
64+
Topic.validates_confirmation_of(:title)
65+
66+
t = Topic.new("title" => "We should be confirmed","title_confirmation" => "")
67+
assert t.invalid?
68+
assert_equal ["doesn't match Test Title"], t.errors[:title_confirmation]
69+
70+
I18n.load_path.replace @old_load_path
71+
I18n.backend = @old_backend
72+
end
73+
5574
end

activemodel/test/cases/validations/i18n_generate_message_validation_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def test_generate_message_invalid_with_custom_message
3737

3838
# validates_confirmation_of: generate_message(attr_name, :confirmation, :message => custom_message)
3939
def test_generate_message_confirmation_with_default_message
40-
assert_equal "doesn't match confirmation", @person.errors.generate_message(:title, :confirmation)
40+
assert_equal "doesn't match Title", @person.errors.generate_message(:title, :confirmation)
4141
end
4242

4343
def test_generate_message_confirmation_with_custom_message

activemodel/test/cases/validations/i18n_validation_test.rb

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_errors_full_messages_uses_format
8181
test "validates_confirmation_of on generated message #{name}" do
8282
Person.validates_confirmation_of :title, validation_options
8383
@person.title_confirmation = 'foo'
84-
@person.errors.expects(:generate_message).with(:title, :confirmation, generate_message_options)
84+
@person.errors.expects(:generate_message).with(:title_confirmation, :confirmation, generate_message_options.merge(:attribute => 'Title'))
8585
@person.valid?
8686
end
8787
end
@@ -217,24 +217,29 @@ def test_errors_full_messages_uses_format
217217

218218
# To make things DRY this macro is defined to define 3 tests for every validation case.
219219
def self.set_expectations_for_validation(validation, error_type, &block_that_sets_validation)
220+
if error_type == :confirmation
221+
attribute = :title_confirmation
222+
else
223+
attribute = :title
224+
end
220225
# test "validates_confirmation_of finds custom model key translation when blank"
221226
test "#{validation} finds custom model key translation when #{error_type}" do
222-
I18n.backend.store_translations 'en', :activemodel => {:errors => {:models => {:person => {:attributes => {:title => {error_type => 'custom message'}}}}}}
227+
I18n.backend.store_translations 'en', :activemodel => {:errors => {:models => {:person => {:attributes => {attribute => {error_type => 'custom message'}}}}}}
223228
I18n.backend.store_translations 'en', :errors => {:messages => {error_type => 'global message'}}
224229

225230
yield(@person, {})
226231
@person.valid?
227-
assert_equal ['custom message'], @person.errors[:title]
232+
assert_equal ['custom message'], @person.errors[attribute]
228233
end
229234

230235
# test "validates_confirmation_of finds custom model key translation with interpolation when blank"
231236
test "#{validation} finds custom model key translation with interpolation when #{error_type}" do
232-
I18n.backend.store_translations 'en', :activemodel => {:errors => {:models => {:person => {:attributes => {:title => {error_type => 'custom message with %{extra}'}}}}}}
237+
I18n.backend.store_translations 'en', :activemodel => {:errors => {:models => {:person => {:attributes => {attribute => {error_type => 'custom message with %{extra}'}}}}}}
233238
I18n.backend.store_translations 'en', :errors => {:messages => {error_type => 'global message'}}
234239

235240
yield(@person, {:extra => "extra information"})
236241
@person.valid?
237-
assert_equal ['custom message with extra information'], @person.errors[:title]
242+
assert_equal ['custom message with extra information'], @person.errors[attribute]
238243
end
239244

240245
# test "validates_confirmation_of finds global default key translation when blank"
@@ -243,7 +248,7 @@ def self.set_expectations_for_validation(validation, error_type, &block_that_set
243248

244249
yield(@person, {})
245250
@person.valid?
246-
assert_equal ['global message'], @person.errors[:title]
251+
assert_equal ['global message'], @person.errors[attribute]
247252
end
248253
end
249254

activemodel/test/cases/validations/validates_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,6 @@ def test_defining_extra_default_keys_for_validates
154154
topic.title = "What's happening"
155155
topic.title_confirmation = "Not this"
156156
assert !topic.valid?
157-
assert_equal ['Y U NO CONFIRM'], topic.errors[:title]
157+
assert_equal ['Y U NO CONFIRM'], topic.errors[:title_confirmation]
158158
end
159159
end

0 commit comments

Comments
 (0)