Normal validation messages tell the user that something is so terribly
wrong as to prohibit an object from saving. I recently had the
additional need to warn users that somethings fishy about their object
even though it doesn't preclude saving it.
In that particular case fishiness only involved a custom validation
method and a new 'warning' level
def validates_not_fishy(options = {})
level = options[:level] ?
options[:level].to_s.pluralize.to_sym :
:errors
send(validation_method(options[:on] || :save)) do |record|
if something_is_fishy
# Instead of
# record.errors.add_to_base("Something is wrong")
# do
record.send(level).add_to_base("Something is wrong")
end
end
end
def warnings
@warnings ||= ActiveRecord::Errors.new(self)
end
All of the above can, of course, be easily added to the classes where it
is needed, or duck punched into ActiveRecord. What I'd like to have is
a way to use the already existing validations for custom validation
levels, too. To be clear, I don't want any further levels to be added
to AR, but I want the necessary hooks to add them myself in an app or
plugin.
Michael
All of the above can, of course, be easily added to the classes where it
is needed, or duck punched into ActiveRecord. What I'd like to have is
a way to use the already existing validations for custom validation
levels, too. To be clear, I don't want any further levels to be added
to AR, but I want the necessary hooks to add them myself in an app or
plugin.
What kind of hooks do you have in mind? I'm always a little suspect
of adding 'hooks' for some theoretical future extensibility, but
there's definitely some scope for improving the implementation of the
validations.
I've always found it a little frustrating that the actual logic for
'validating the presence of' isn't encapsulated in a single function
that you can call from your own validations. So the validations could
be used in situations where the macros don't apply.
I'm asking for nothing more than
record.send(level).add_to_base("Something is wrong")
instead of
record.errors.add_to_base("Something is wrong")
wherever it applies with level defaulting to :errors, i.e.
level = options[:level] ?
options[:level].to_s.pluralize.to_sym :
:errors
Michael
wherever it applies with level defaulting to :errors, i.e.
level = options[:level] ?
options[:level].to_s.pluralize.to_sym :
:errors
Whip up a patch for this so we can see how widespread the result is.
I'm a little suspect of making this kind of change, but if it's
relatively low impact perhaps it's not so bad.