No necesitas redefinir las validaciones para algo que es netamente visual, lo que puedes hacer es redefinir el helper que muestra el dialogo de errores, como te darás cuenta cuando muestras los errores de un formulario llamas al metodo "error_messages_for", pues bien, partiendo del codigo de la api de ror (tambien le quite algunas cosas para hacerlo mas simple), se me ocurrio esta solucion para tu problema:
Código:
def error_messages_for(*params)
options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {}
objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
count = objects.inject(0) {|sum, object| sum + object.errors.count }
unless count.zero?
html = {}
[:id, :class].each do |key|
if options.include?(key)
value = options[key]
html[key] = value unless value.blank?
else
html[key] = 'errorExplanation'
end
end
error_messages = objects.map {|object| object.errors.map {|msg| content_tag(:li, msg[1])}}
content_tag(:div,
content_tag(:h2, 'Se encontraron los siguientes errores:') <<
content_tag(:ul, error_messages),
html
)
else ''
end
end
Donde la parte importante del codigo y el gran cambio sucede en una sola linea:
error_messages = objects.map {|object| object.errors.map {|msg| content_tag(:li, msg[1])}}
Antes se utilizaba el método object.errors.full_messages, que retorna un Array con el atributo del error unido al mensaje, en cambio, ahora solo mostramos la descripcion del error con msg[1], mas no el campo donde ocurrio el error, esto significa que ya no queremos que muestre el nombre del atributo dentro del mensaje de error, esto es un riesgo pues puede resultar confuso si no especificas en el mensaje dónde ocurrió el error, aqui te pongo un ejemplo:
class Algo < ActiveRecord::Base
...
validates_presence_of :titulo, :message => "El atributo necesita un titulo!"
...
end
de esta forma, puedes personalizar mas tus mensajes de error y mostrarlos de la misma forma que siempre lo harías, espero te sea util, saludos.