Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions demo/app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 6 additions & 4 deletions lib/bootstrap_form/components/validation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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)
Expand Down
22 changes: 22 additions & 0 deletions test/bootstrap_checkbox_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
<div class="form-check mb-3">
<input #{autocomplete_attr} name="user[status]" type="hidden" value="0"/>
<input class="form-check-input" id="user_status" name="user[status]" type="checkbox" value="1"/>
<label class="form-check-label" for="user_status">Status</label>
</div>
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
<div class="form-check mb-3">
<input #{autocomplete_attr} name="user[misc]" type="hidden" value="0"/>
<input class="form-check-input" id="user_misc" name="user[misc]" type="checkbox" value="1"/>
<label class="form-check-label" for="user_misc">Misc</label>
</div>
HTML
assert_equivalent_html expected, @builder.check_box(:misc)
end
end