diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2015-02-13 12:09:36 -0200 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2015-02-13 12:09:36 -0200 |
commit | 7919c29d507b571315a6391fe56bf4f3bce23689 (patch) | |
tree | 205846ad837a1baacf5572a6fd25e035da1ee050 /activemodel/lib | |
parent | cc08de856acab3f480eb76b3e80cf2ea7705c9b6 (diff) | |
parent | c3fa5c3d25d9148d2806db577a2261032b341c34 (diff) | |
download | rails-7919c29d507b571315a6391fe56bf4f3bce23689.tar.gz rails-7919c29d507b571315a6391fe56bf4f3bce23689.tar.bz2 rails-7919c29d507b571315a6391fe56bf4f3bce23689.zip |
Merge pull request #16381 from kakipo/validate-length-tokenizer
Allow symbol as values for `tokenizer` of `LengthValidator`
Diffstat (limited to 'activemodel/lib')
-rw-r--r-- | activemodel/lib/active_model/validations/length.rb | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/activemodel/lib/active_model/validations/length.rb b/activemodel/lib/active_model/validations/length.rb index a96b30cadd..c63a9d74b3 100644 --- a/activemodel/lib/active_model/validations/length.rb +++ b/activemodel/lib/active_model/validations/length.rb @@ -38,7 +38,7 @@ module ActiveModel end def validate_each(record, attribute, value) - value = tokenize(value) + value = tokenize(record, value) value_length = value.respond_to?(:length) ? value.length : value.to_s.length errors_options = options.except(*RESERVED_OPTIONS) @@ -59,10 +59,14 @@ module ActiveModel end private - - def tokenize(value) - if options[:tokenizer] && value.kind_of?(String) - options[:tokenizer].call(value) + def tokenize(record, value) + tokenizer = options[:tokenizer] + if tokenizer && value.kind_of?(String) + if tokenizer.kind_of?(Proc) + tokenizer.call(value) + elsif record.respond_to?(tokenizer) + record.send(tokenizer, value) + end end || value end @@ -108,8 +112,8 @@ module ActiveModel # * <tt>:message</tt> - The error message to use for a <tt>:minimum</tt>, # <tt>:maximum</tt>, or <tt>:is</tt> violation. An alias of the appropriate # <tt>too_long</tt>/<tt>too_short</tt>/<tt>wrong_length</tt> message. - # * <tt>:tokenizer</tt> - Specifies how to split up the attribute string. - # (e.g. <tt>tokenizer: ->(str) { str.scan(/\w+/) }</tt> to count words + # * <tt>:tokenizer</tt> - Specifies a method, proc or string to how to split up the attribute string. + # (e.g. <tt>tokenizer: ->(str) { str.scan(/\w+/) }</tt> or <tt>tokenizer: :word_tokenizer</tt> to count words # as in above example). Defaults to <tt>->(value) { value.split(//) }</tt> # which counts individual characters. # |