Using model validations to determine whether a field is required.

This commit is contained in:
Guilherme Cirne 2010-05-15 05:58:36 +08:00 committed by José Valim
parent 79215f6751
commit 938166762f
5 changed files with 51 additions and 5 deletions

View File

@ -49,6 +49,11 @@ module SimpleForm
end
def attribute_required?
klass = object.class
if defined? klass.validators_on
return options[:required] unless options[:required].nil?
return klass.validators_on(attribute_name).map {|validator| validator.kind}.include?(:presence)
end
options[:required] != false
end

View File

@ -94,13 +94,27 @@ class LabelTest < ActionView::TestCase
with_label_for @user, :created_at, :datetime
assert_select 'label.datetime'
end
test 'label should obtain required from ActiveModel::Validations when it is included' do
with_label_for @validating_user, :name, :string
assert_select 'label.required'
with_label_for @validating_user, :status, :string
assert_select 'label.optional'
end
test 'label should allow overriding required when ActiveModel::Validations is included' do
with_label_for @validating_user, :name, :string, :required => false
assert_select 'label.optional'
with_label_for @validating_user, :status, :string, :required => true
assert_select 'label.required'
end
test 'label should be required by default' do
test 'label should be required by default when ActiveModel::Validations is not included' do
with_label_for @user, :name, :string
assert_select 'label.required'
end
test 'label should be able to disable required' do
test 'label should be able to disable required when ActiveModel::Validations is not included' do
with_label_for @user, :name, :string, :required => false
assert_no_select 'label.required'
end

View File

@ -229,12 +229,26 @@ class FormBuilderTest < ActionView::TestCase
assert_select 'span.error#cool', "can't be blank"
end
test 'builder input should be required by default' do
test 'builder input should obtain required from ActiveModel::Validations when it is included' do
with_form_for @validating_user, :name
assert_select 'input.required#validating_user_name'
with_form_for @validating_user, :status
assert_select 'input.optional#validating_user_status'
end
test 'builder input should allow overriding required when ActiveModel::Validations is included' do
with_form_for @validating_user, :name, :required => false
assert_select 'input.optional#validating_user_name'
with_form_for @validating_user, :status, :required => true
assert_select 'input.required#validating_user_status'
end
test 'builder input should be required by default when ActiveModel::Validations is not included' do
with_form_for @user, :name
assert_select 'input.required#user_name'
end
test 'builder input should allow disabling required' do
test 'builder input should allow disabling required when ActiveModel::Validations is not included' do
with_form_for @user, :name, :required => false
assert_no_select 'input.required'
assert_select 'input.optional#user_name'

View File

@ -100,3 +100,8 @@ class User < OpenStruct
}
end
end
class ValidatingUser < User
include ActiveModel::Validations
validates :name, :presence => true
end

View File

@ -55,6 +55,13 @@ class ActionView::TestCase
:description => 'Hello!',
:created_at => Time.now
}.merge(options))
@validating_user = ValidatingUser.new({
:id => 1,
:name => 'New in Simple Form!',
:description => 'Hello!',
:created_at => Time.now
}.merge(options))
end
def protect_against_forgery?
@ -66,4 +73,5 @@ class ActionView::TestCase
end
alias :users_path :user_path
alias :super_user_path :user_path
alias :validating_user_path :user_path
end