diff --git a/demo/app/models/user.rb b/demo/app/models/user.rb index e5317f1d1..105e439f0 100644 --- a/demo/app/models/user.rb +++ b/demo/app/models/user.rb @@ -10,6 +10,10 @@ class User < ApplicationRecord validates :email, presence: true, length: { minimum: 5 } validates :terms, acceptance: { accept: true } + # Conditional (always disabled) validators used in tests + validates :status, presence: true, if: -> { age > 42 } + validates :misc, presence: true, unless: -> { feet == 5 } + has_one :address accepts_nested_attributes_for :address diff --git a/lib/bootstrap_form/components/validation.rb b/lib/bootstrap_form/components/validation.rb index e4dde39fd..b054482f3 100644 --- a/lib/bootstrap_form/components/validation.rb +++ b/lib/bootstrap_form/components/validation.rb @@ -26,7 +26,7 @@ def required_attribute?(obj, attribute) target = obj.instance_of?(Class) ? obj : obj.class return false unless target.respond_to? :validators_on - presence_validator?(target_validators(target, attribute)) || + presence_validator?(target_unconditional_validators(target, attribute)) || required_association?(target, attribute) end @@ -35,12 +35,14 @@ def required_association?(target, attribute) next unless a.is_a?(ActiveRecord::Reflection::BelongsToReflection) next unless a.foreign_key == attribute.to_s - presence_validator?(target_validators(target, name)) + presence_validator?(target_unconditional_validators(target, name)) end end - def target_validators(target, attribute) - target.validators_on(attribute).map(&:class) + def target_unconditional_validators(target, attribute) + target.validators_on(attribute) + .reject { |validator| validator.options[:if].present? || validator.options[:unless].present? } + .map(&:class) end def presence_validator?(target_validators) diff --git a/test/bootstrap_checkbox_test.rb b/test/bootstrap_checkbox_test.rb index c2acd0bda..01eb49c2e 100644 --- a/test/bootstrap_checkbox_test.rb +++ b/test/bootstrap_checkbox_test.rb @@ -644,4 +644,26 @@ class BootstrapCheckboxTest < ActionView::TestCase HTML assert_equivalent_html expected, @builder.check_box(:email, label: "Email") end + + test "an attribute with required and if is not marked as required" do + expected = <<~HTML +
+ + + +
+ HTML + assert_equivalent_html expected, @builder.check_box(:status, label: "Status") + end + + test "an attribute with presence validator and unless is not marked as required" do + expected = <<~HTML +
+ + + +
+ HTML + assert_equivalent_html expected, @builder.check_box(:misc) + end end