validates_format_of

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!

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: