Yeah... I''ve seen something like this. I think rails is attempting to
convert the input to int and just makes it zero if it gets letters. I
know that sounds stupid, but I''m pretty sure that''s what it
does.
The good news is that you should be able to use
validates_numericality_of to check for letters. The problem with that is
that as near as I can tell, you can''t specify a positive value (you can
specify only_integer though).
The trick that that validation uses -- and an excellent thing to learn
about rails -- is it checks the value "before_type_cast". ActiveRecord
keeps a buffer of the input values before they are type cast and you can
access them with <field_name>_before_type_cast.
So, you could try just changing :grade in your validates_format_of to
:grade_before_type_cast. Not sure if that will work at all, but it
should in theory.
Hope this helps....
b
Afroz wrote:> Hi everyone!
> I''m new to rails and have been playing around a bit.
Unfortunately, I
> seem to be a bit stuck at the moment. Since I''m just playing
around,
> I''m using a dynamic scaffold. In my model file (which is tied to a
> database table), I have the following line:
> validates_format_of :grade, :with => /^[0-9]+$/, :message =>
''should
> be zero or a positive integer''
>
> ''grade'' is an int(6) column in my table. What I would
expect is that
> if I enter some random letters such as "asdas" in a form, then
the
> string should be considered invalid and should throw an error.
> However, this does not occur. Instead, the form saves the data into
> the table with a value of 0.
> During my tests, I changed [0-9] to [1-9]. On doing so, "asdas"
would
> not be accepted anymore, but "123as" would. "123" would
be saved to
> the database.
> Perhaps my understanding of the above regular expression is wrong? It
> is my first time using regexp. However, I wrote a little test program
> in ruby:
> tst = Array.new
> tst[0] = ''letters''
> tst[1] = ''123let''
> tst[2] = ''let123''
> tst[3] = ''1234''
> tst[4] = ''5''
> tst[6] = ''1.5''
>
> tst.each do |type|
> puts "#{type}\n" if type =~ /^[0-9]+$/
> end
>
> As I expect, only 1234 and 5 are printed. It seems to work as expected
> in this little program, but not during validation.
> Any help/suggestions would be greatly appreciated!
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---