Using model validations to determine whether a field is required.
This commit is contained in:
parent
79215f6751
commit
938166762f
|
@ -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
|
||||
|
|
@ -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
|
|
@ -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'
|
|
@ -100,3 +100,8 @@ class User < OpenStruct
|
|||
}
|
||||
end
|
||||
end
|
||||
|
||||
class ValidatingUser < User
|
||||
include ActiveModel::Validations
|
||||
validates :name, :presence => true
|
||||
end
|
|
@ -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
|
Loading…
Reference in New Issue