Skip to content

Commit

Permalink
Merge pull request DavyJonesLocker#369 from michaelbaldry/master
Browse files Browse the repository at this point in the history
Do not validate fields with _destroy="1" in their input group
  • Loading branch information
bcardarella committed Aug 16, 2012
2 parents fe69111 + c8da755 commit 2a4d5f4
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 59 deletions.
58 changes: 34 additions & 24 deletions coffeescript/rails.validations.coffee
Expand Up @@ -86,41 +86,51 @@ validateForm = (form, validators) ->


validateElement = (element, validators) -> validateElement = (element, validators) ->
element.trigger('element:validate:before') element.trigger('element:validate:before')


if element.data('changed') != false passElement = ->
element.trigger('element:validate:pass').data('valid', null)

failElement = (message) ->
element.trigger('element:validate:fail', message).data('valid', false)
false

afterValidate = ->
element.trigger('element:validate:after').data('valid') != false

executeValidators = (context) ->
valid = true valid = true
element.data('changed', false)

# Because 'length' is defined on the list of validators we cannot call jQuery.each on
context = ClientSideValidations.validators.local
for kind, fn of context for kind, fn of context
if validators[kind] if validators[kind]
for validator in validators[kind] for validator in validators[kind]
if message = fn.call(context, element, validator) if message = fn.call(context, element, validator)
element.trigger('element:validate:fail', message).data('valid', false) valid = failElement(message)
valid = false
break break
unless valid unless valid
break break

valid


# if _destroy for this input group == "1" pass with flying colours, it'll get deleted anyway..
destroyInputName = element.attr('name').replace(/\[([^\]]*?)\]$/, '[_destroy]')
if $("input[name='#{destroyInputName}']").val() == "1"
passElement()
return afterValidate()

# if the value hasn't changed since last validation, do nothing
unless element.data('changed') != false
return afterValidate()


if valid element.data('changed', false)
context = ClientSideValidations.validators.remote
for kind, fn of context
if validators[kind]
for validator in validators[kind]
if message = fn.call(context, element, validator)
element.trigger('element:validate:fail', message).data('valid', false)
valid = false
break
unless valid
break


if valid local = ClientSideValidations.validators.local
element.data('valid', null) remote = ClientSideValidations.validators.remote
element.trigger('element:validate:pass')


element.trigger('element:validate:after') if executeValidators(local) and executeValidators(remote)
element.data('valid') != false passElement()

afterValidate()


# Main hook # Main hook
# If new forms are dynamically introduced into the DOM the .validate() method # If new forms are dynamically introduced into the DOM the .validate() method
Expand Down
13 changes: 10 additions & 3 deletions test/javascript/public/test/validateElement.js
Expand Up @@ -61,7 +61,14 @@ module('Validate Element', {
id: 'user_phone_numbers_attributes_0_number', id: 'user_phone_numbers_attributes_0_number',
'data-validate': 'true', 'data-validate': 'true',
type: 'text' type: 'text'
})) })
.append($('<input />', {
name: 'user[phone_numbers_attributes][0][_destroy]',
id: 'user_phone_numbers_attributes_0__destroy',
'data-validate': 'true',
type: 'hidden',
value: "1"
})))
.append($('<label for="user_phone_numbers_attributes_1_number">Phone Number</label>')) .append($('<label for="user_phone_numbers_attributes_1_number">Phone Number</label>'))
.append($('<input />', { .append($('<input />', {
name: 'user[phone_numbers_attributes][1][number]', name: 'user[phone_numbers_attributes][1][number]',
Expand Down Expand Up @@ -114,8 +121,8 @@ test('Validate nested attributes', function() {
input = form.find('input#user_phone_numbers_attributes_0_number'); input = form.find('input#user_phone_numbers_attributes_0_number');
label = $('label[for="user_phone_numbers_attributes_0_number"]'); label = $('label[for="user_phone_numbers_attributes_0_number"]');
input.trigger('focusout'); input.trigger('focusout');
ok(input.parent().hasClass('field_with_errors')); equal(input.parent().hasClass('field_with_errors'), false);
ok(label.parent().hasClass('field_with_errors')); equal(label.parent().hasClass('field_with_errors'), false);
}); });


test('Validate when keyup on confirmation', function() { test('Validate when keyup on confirmation', function() {
Expand Down
62 changes: 30 additions & 32 deletions vendor/assets/javascripts/rails.validations.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 2a4d5f4

Please sign in to comment.