http://sishen.lifegoo.com/?p=42
I don''t know whether there exists a builtin validation that can check
the
number range. I think the requirement is normal, but indeed, i can''t
find
it. So i wrote a custome validation: validates_number_range, whose
prototype is validates_length_of. If there already exists one, pls tell me,
:)
The code is below, welcome to give me any advice on my blog. And also, more
details information on the blog, :)
module ActiveRecord
module Validations
module ClassMethods
def validates_number_range(*attrs)
validates_numericality_of attrs.first
options = {
:too_big => "is too big (maximum is %d)",
:too_small => "is too small (minimum is %d)",
:wrong_number => "is the wrong number (should be %d)"
}.merge(DEFAULT_VALIDATION_OPTIONS)
options.update(attrs.pop.symbolize_keys) if attrs.last.is_a?(Hash)
# Ensure that one and only one range option is specified.
range_options = ALL_RANGE_OPTIONS & options.keys
case range_options.size
when 0
raise ArgumentError, ''Range unspecified. Specify the
:within,
:maximum, :minimum, or :is option.''
when 1
# Valid number of options; do nothing.
else
raise ArgumentError, ''Too many range options specified.
Choose
only one.''
end
# Get range option and value.
option = range_options.first
option_value = options[range_options.first]
case option
when :within, :in
raise ArgumentError, ":#{option} must be a Range" unless
option_value.is_a?(Range)
too_small = options[:too_small] % option_value.begin
too_big = options[:too_big] % option_value.end
validates_each(attrs, options) do |record, attr, value|
if value.nil? or value < option_value.begin
record.errors.add(attr, too_small)
elsif value > option_value.end
record.errors.add(attr, too_big)
end
end
when :is, :minimum, :maximum
raise ArgumentError, ":#{option} must be a nonnegative
Integer"
unless option_value.is_a?(Integer) and option_value >= 0
# Declare different validations per option.
validity_checks = { :is => "==", :minimum =>
">=", :maximum =>
"<=" }
message_options = { :is => :wrong_number, :minimum =>
:too_small,
:maximum => :too_big }
message = (options[:message] || options[message_options[option]])
% option_value
validates_each(attrs, options) do |record, attr, value|
record.errors.add(attr, message) unless !value.nil? and
value.method(validity_checks[option])[option_value]
end
end
end
end
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
If I understood what you are trying to do correctly validates_length_of :user_name, :within => 6..20, :too_long => "pick a shorter name", :too_short => "pick a longer name" from http://railsmanual.com/module/ActiveRecord::Validations::ClassMethods/validates_length_of/1.1.2 Matt Ye Dingding wrote:> http://sishen.lifegoo.com/?p=42 > > I don''t know whether there exists a builtin validation that can check > the > number range. I think the requirement is normal, but indeed, i can''t > find > it. So i wrote a custome validation: validates_number_range, whose > prototype is validates_length_of. If there already exists one, pls tell > me, > :) >-- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
No, that''s not i want to do. Sorry, my
blog(http://sishen.lifegoo.com/?p=42)
gives more information, so i gave less information in the mail.
My scenario is that I want to check the uploaded file size, for example,
less than 5M. But what validates_length_of is the size, when is a fixnum, is
4. So validates_length_of can''t be work for me.
Using validates_number_range, now i can code as below:
validates_number_range :file_size,
:maximum => 5242880,
:message => "you can only upload file less than
5M",
:on => :create
On 6/25/07, Matt Sir
<rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org>
wrote:>
>
> If I understood what you are trying to do correctly
> validates_length_of :user_name, :within => 6..20, :too_long =>
"pick a
> shorter name", :too_short => "pick a longer name"
>
> from
>
>
http://railsmanual.com/module/ActiveRecord::Validations::ClassMethods/validates_length_of/1.1.2
>
> Matt
>
> Ye Dingding wrote:
> > http://sishen.lifegoo.com/?p=42
> >
> > I don''t know whether there exists a builtin validation that
can check
> > the
> > number range. I think the requirement is normal, but indeed, i
can''t
> > find
> > it. So i wrote a custome validation: validates_number_range, whose
> > prototype is validates_length_of. If there already exists one, pls
tell
> > me,
> > :)
> >
>
> --
> Posted via http://www.ruby-forum.com/.
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
Today i looked through the validations.rb in rails edge. I''m glad to find that validates_numericality_of method already has the support for range check. The related options are - greater_than - greater_than_or_equal_to - equal_to - less_than - less_than_or_equal_to - odd - even With these, life are more better, :) On 6/25/07, Ye Dingding <yedingding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > No, that''s not i want to do. Sorry, my blog( > http://sishen.lifegoo.com/?p=42) gives more information, so i gave less > information in the mail. > > My scenario is that I want to check the uploaded file size, for example, > less than 5M. But what validates_length_of is the size, when is a fixnum, is > 4. So validates_length_of can''t be work for me. > > Using validates_number_range, now i can code as below: > > validates_number_range :file_size, > :maximum => 5242880, > :message => "you can only upload file less than > 5M", > :on => :create > > > On 6/25/07, Matt Sir <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org > wrote: > > > > > > If I understood what you are trying to do correctly > > validates_length_of :user_name, :within => 6..20, :too_long => "pick a > > shorter name", :too_short => "pick a longer name" > > > > from > > http://railsmanual.com/module/ActiveRecord::Validations::ClassMethods/validates_length_of/1.1.2 > > > > > > Matt > > > > Ye Dingding wrote: > > > http://sishen.lifegoo.com/?p=42 > > > > > > I don''t know whether there exists a builtin validation that can check > > > the > > > number range. I think the requirement is normal, but indeed, i can''t > > > find > > > it. So i wrote a custome validation: validates_number_range, whose > > > prototype is validates_length_of. If there already exists one, pls > > tell > > > me, > > > :) > > > > > > > -- > > Posted via http://www.ruby-forum.com/. > > > > > > > > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---