Hi Michael.
Thanks for replying.
Michael Koziarski <michael@koziarski.com> writes:
In general I find it confusing that my validation takes place after
the column_specific type cast. I would rather have a validation
message when my boolean field is set to "some arbitraty text" instead
of letting it be swallowed by some fall_back value in
ActiveRecord::ConnectionAdapters::Column::value_to_boolean.
In general I find it confusing and not clearly documented that
validations occur after the type_cast mechanism (is that true for
all types? also times/dates?)
Yeah, it happens for all types otherwise you couldn't do something like this:
validates_inclusion_of :price, :in=>0..500
I see. However it is unclear which validates_* macros that validates the raw
value and which that validates the type_casted value.
Form submission values are all strings and "30" wouldn't pass that
validation if it were done before typecasting. Similarly your
validation wouldn't work with check_box_tag.
Well, this is exactly my problem, the current implementation does not
work with the suggested validation for booleans:
The current suggested way to validate booleans is
validates_inclusion_of :balloon, :in => [true, false]
But that does NOT work, providing "something else" as parameter to
:balloon passes the validation, becauase it is converted to false
before the validates_inclusion_of
So for all boolean fields I must write sometning like this:
validates_each(:balloon) do |record,attr_name,value|
raw_value = record.send("#{attr_name}_before_type_cast")
unless ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.union(ActiveRecord::ConnectionAdapters::Column::FALSE_VALUES).member? raw_value
record.errors.add(attr_name, :inclusion, :default => "is not a boolean value", :value => raw_value)
end
end
I am quite surprised that I am the only/first one having this problem,
boolean values can't be that rare. I didn't do anything special, just
introduced a boolean field, and added some tests like (using shoulda):
should_allow_values_for :balloon, true, false
should_not_allow_values_for :balloon, nil, '', 'any ohter value'
And then the problem showed up.
Jarl