Tenemos algunas aplicaciones funcionando con Rails 2.3 y me ha llevado un ratito averiguar como especificar un mensaje de error personalizado cuando se realiza una validación desde una llamada Ajax. Los errores flash no son un problema, ya que basta con crear la validación por ejemplo así:
validates_format_of :telf, :with =>/^[0-9]{9}\s*(,?\s*[0-9]{9})*$/, :message => ': hay un problema con el formato de los números de teléfono', :if => :telf, :allow_blank => true
El mensaje de error se especifica mediante el símbolo ‘:message’, y rails lo muestra mediante el mecanismo de ‘errores flash’ sin problema. Sin embargo, al utilizar la gema Hobo y los editores de formulario que realizan cambios en los registros desde los shows directamente, mediante llamadas Ajax a los métodos update de los controladores; al mostrar un error mediante un alert, aparecía un incómodo mensaje:
No es posible realizar el cambio: {{attribute}} {{message}}
El problema es que attribute y message no se estaban interpolando correctamente y necesitaba modificarlos para poder mostrar un mensaje algo mas específico. La solución, como casi siempre, en los comentarios y la documentación 🙂
Indagando el código fuente de Rails 2.3.8, concretamente en el fichero: /donde_tengas_la_gema_instalada/activerecord-2.3.8/lib/active_record/validations.rb, en la línea 81, se especifica que tocando el fichero locales correspondiente, puedes mostrar el mensaje que necesites. ¡Dicho y hecho!, basta con añadir:
activerecord: errors: full_messages: format: 'Este es un mensaje personalizado'
y listo 🙂