Ignore required attribute when conditional validations are present. Closes #250

This commit is contained in:
Rafael Mendonça França 2011-06-11 22:56:41 -03:00
parent b424f771f2
commit bd43bca15b
4 changed files with 26 additions and 1 deletions

View File

@ -1,5 +1,8 @@
== master
* enhancements
* ignore required attribute when conditional validations are present
* bug fix
* Do not use required='required' when browser validations are turned off
* Sanitize HMTL attributes in error and hint helpers when options are present

View File

@ -66,7 +66,9 @@ module SimpleForm
if !options[:required].nil?
options[:required]
elsif has_validators?
(attribute_validators + reflection_validators).any? { |v| v.kind == :presence }
(attribute_validators + reflection_validators).any? do |v|
v.kind == :presence && !conditional_validators?(v)
end
else
attribute_required_by_default?
end
@ -93,6 +95,10 @@ module SimpleForm
reflection ? object.class.validators_on(reflection.name) : []
end
def conditional_validators?(validator)
validator.options.include?(:if) || validator.options.include?(:unless)
end
def attribute_required_by_default?
SimpleForm.required_by_default
end

View File

@ -338,6 +338,20 @@ class FormBuilderTest < ActionView::TestCase
assert_select 'input.optional#user_name'
end
test 'builder input should not be required when ActiveModel::Validations is included and if option is present' do
with_form_for @validating_user, :age
assert_no_select 'input.required'
assert_no_select 'input[required]'
assert_select 'input.optional#validating_user_age'
end
test 'builder input should not be required when ActiveModel::Validations is included and unless option is present' do
with_form_for @validating_user, :amount
assert_no_select 'input.required'
assert_no_select 'input[required]'
assert_select 'input.optional#validating_user_amount'
end
# WRAPPERS
test 'builder support wrapping around an specific tag' do
swap SimpleForm, :wrapper_tag => :p do

View File

@ -127,6 +127,8 @@ class ValidatingUser < User
include ActiveModel::Validations
validates :name, :presence => true
validates :company, :presence => true
validates :age, :presence => true, :if => Proc.new { |user| user.name }
validates :amount, :presence => true, :unless => Proc.new { |user| user.age }
validates_numericality_of :age,
:greater_than_or_equal_to => 18,
:less_than_or_equal_to => 99,