Validation problems

Hi, there.
I have two validations in the model:

validates_numericality_of :value, :only_integer=>true,
:allow_blank=>true
validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}

They work as expected except when the :value is character/string like
“a” “abc”, the second validation will also output error message “must be
5-digit number”. What I want is the second validation displays error
message only when the :value is a number. I think :if=>Proc.new{|u|
u.value.is_a?(Numeric)} would take care of it, but it didn’t.

The second problem is about the custom validation. I got a very simple
custom validation. Whenever there is an error, it catches it and shows
the error message. But the field with error is not highlighted. I
checked the source of the page, the “fieldwitherror” was not generated
on the field checked by the custom validation. I tried the
validation_reflection plugin. It catched the error but there’s no error
message under the field. Normally that’s where the message should be.
I guess they are related but I am not sure what causes it.

Any help will be appreciated.

validates_numericality_of :value, :only_integer=>true,
:allow_blank=>true
validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}

Try it as u.is_a?(Numeric)

E. Litwin wrote:

validates_numericality_of :value, :only_integer=>true,
:allow_blank=>true
validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}

Try it as u.is_a?(Numeric)

Thanks Litwin.
I tried that before but it made the second validation stop working.

Sharagoz – wrote:

validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}
Looks corrent to me. Maybe the name of the field “value” is causing a
conflict somewhere. Try to rename the field to something else just to
test.
Thanks Sharagoz. I tried different names for the field but none of
those worked.
I just wrote a custom validation to workaround it although still can’t
figure it out.

Anyone has any idea about the second problem?

validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}
Looks corrent to me. Maybe the name of the field “value” is causing a
conflict somewhere. Try to rename the field to something else just to
test.

On Tue, Feb 9, 2010 at 4:03 PM, Ichiro S. [email protected]
wrote:

Hi, there.
I have two validations in the model:

validates_numericality_of :value, :only_integer=>true,
:allow_blank=>true
validates_size_of :value, :is=>9, :message=>“must be 5-digit number”,
:if=>Proc.new{|u| u.value.is_a?(Numeric)}

Ichiro, you have a bit of duplication within your validates_. For
example,
you’re
testing whether or not :value is numeric within both validates_

methods.
Next, the
:is compares the number of bytes and not the number of characters you
should
be
able to do the following:

validates_numericality_of :value, :only_integer => true, :allow_blank
=>
true # make sure that it’s an integer
validate :number_of_digits
# make sure that we have five digits

private

def number_of_digits
unless self.value.to_s.size == 5
errors.add :value, “should be 5 digits”
end
end

Good luck,

-Conrad

validates_numericality_of :value, :only_integer => true, :allow_blank
=>
true # make sure that it’s an integer
validate :number_of_digits
# make sure that we have five digits

private

def number_of_digits
unless self.value.to_s.size == 5
errors.add :value, “should be 5 digits”
end
end

Good luck,

-Conrad

Hi, Conrad. Thank you for the explanation. My workaround looks similar
to your code and works. I still have no clue why :if=>Proc.new{…}
didn’t work though.