Skip to content

Commit

Permalink
Use proc to set password length validation so it's possible to overri…
Browse files Browse the repository at this point in the history
…de it dynamically.

Co-authored-by: Manoj M J <manojmj92@gmail.com>
  • Loading branch information
nashby and manojmj92 committed Nov 29, 2024
1 parent dce20b7 commit 8c7279e
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 4 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@
* Removed deprecations warning output for `Devise::Models::Authenticatable::BLACKLIST_FOR_SERIALIZATION` (@soartec-lab)
* Add Rails 8 support.
- Routes are lazy-loaded by default in test and development environments now so Devise loads them before `Devise.mappings` call.
* Password length validator is changed from
`validates_length_of :password, within: password_length, allow_blank: true`
to
`validates_length_of :password, minimum: proc { password_length.min }, maximum: proc { password_length.max }, allow_blank: true`
so it's possible to override `password_length` at runtime. (@manojmj92)
* bug fixes
* Make `Devise` work without `ActionMailer` when `Zeitwerk` autoloader is used.
Expand Down
4 changes: 3 additions & 1 deletion lib/devise/models/validatable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ module Models
# * +email_regexp+: the regular expression used to validate e-mails;
# * +password_length+: a range expressing password length. Defaults to 6..128.
#
# Since +password_length+ is applied in a proc within `validates_length_of` it can be overridden
# at runtime.
module Validatable
# All validations used by this module.
VALIDATIONS = [:validates_presence_of, :validates_uniqueness_of, :validates_format_of,
Expand All @@ -34,7 +36,7 @@ def self.included(base)

validates_presence_of :password, if: :password_required?
validates_confirmation_of :password, if: :password_required?
validates_length_of :password, within: password_length, allow_blank: true
validates_length_of :password, minimum: proc { password_length.min }, maximum: proc { password_length.max }, allow_blank: true
end
end

Expand Down
4 changes: 2 additions & 2 deletions test/models_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def assert_include_modules(klass, *modules)
test 'validations options are not applied too late' do
validators = WithValidation.validators_on :password
length = validators.find { |v| v.kind == :length }
assert_equal 2, length.options[:minimum]
assert_equal 6, length.options[:maximum]
assert_equal 2, length.options[:minimum].call
assert_equal 6, length.options[:maximum].call
end

test 'validations are applied just once' do
Expand Down

0 comments on commit 8c7279e

Please sign in to comment.