Correct place for validation error messages

Folks,

I'm struggling to work out the correct place for storing object validation error strings. Standard conventions would tell me to put all validation in the model, and if necessary override the error message using the :message symbol.

But I'm struggling to see how this works with I18N. All error messages incorporate the (english) field name, and I can attach just one (english) error message to each validation. Even without I18N issues, the presentation might use different terminology than the model, or terminology might even change during development.

I could create an exception class that deals with parameterized error messages (does this already exist?), and then format these exceptions in the controller before presentation. But this would seem to be something that has likely been done before.

Does anyone have experience in this area? Should I just not worry about I18N yet, given the low probability of building something that reaches the point where this is a consideration?

Thanks, Chris

Take a look at heavy artillery - Globalize plugin (http://www.globalize-rails.org/wiki/). Also, there is an alternative - gettext plugin ( http://manuals.rubyonrails.com/read/chapter/105).

Chris,

I ran into a problem related, but not quite like yours. My situation involved having a user-configurable central store of error messages, something that could be customized for each validation on each attribute on each model and might be changed often based on the whims of others. The final solution, after going through a few iterations of nastiness involving things like rewriting all the validation methods so they check the customized error messages, was this:

Let the validation occur as normal. Then (as an after_validate callback) go over the error messages and change them from the default to the custom. At this point, the model is known, the attribute is known because of the structure of ActiveRecord::Errors, and the validation is known because of the distinctive default message. It's nice and scalable, too. All you have to do is know the default message for any new validation introduced to your system (from a plugin, perhaps).