Traducción mensajes de validación ActiveRecord

Problema: error_message_on NO muestra los mensajes de error para cada
campo en la vista. No obstante mensajes_error_para realiza su tarea
correctamente, genera un mensaje indicando que no se ha podido
almacenar.

Siguiendo el procedimiento encontrado aqui [1] :

Primeramente redefino el array que utiliza ActiveRecord, y además
nuestra versión de error_messages_for, creando un archivo en
lib/traduccion_validaciones.rb :

module ActiveRecord
class Errors
begin
@@default_error_messages = {
:inclusion => “Es obligatorio”,
:exclusion => “Es campo reservado”,
:invalid => “No es válido”,
:confirmation => “No coincide la confirmación”,
:accepted => “Debe ser aceptado”,
:empty => “No puede estar vacío”,
:too_long => “Es demasiado largo (%d caracteres como
máximo)”,
:too_short => “Es demasiado corto (%d caracteres como
mínimo)”,
:wrong_length => “Debe tener %d caracteres”,
:taken => “Ya existe”,
:not_a_number => “No es un número”
}
end
end
end

module ActionView
module Helpers
module ActiveRecordHelper
def mensajes_error_para (object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get(“@#{object_name}”)
unless object.errors.empty?
content_tag(“div”,
content_tag(
options[:header_tag] || “h2”,
“El #{object_name.to_s.gsub(”_", " “)} no puede
crearse”))
end
end
end
end
end

Siguiendo con el procedimiento, invocamos el código anterior en
config/environment.rb, antes de invocar Rails::Initializer :

require File.join(File.dirname(FILE), ‘boot’)

require ‘traduccion_validaciones’

Rails::Initializer.run do |config|
.
.
.

En _form.rhtml en la vista :

<%= mensajes_error_para ‘cuenta’ %>

<%= error_message_on(:cuenta, :banco) %>Banco
<%= text_field 'cuenta', 'banco' %>

<%= error_message_on(:cuenta, :banco) %>Tipo
<%= text_field 'cuenta', 'tipo' %>

En el modelo :

class Cuenta < ActiveRecord::Base
validates_presence_of :banco, :tipo
end

[1] http://sobrerailes.com/articles/2006/03/18/sudoku-on-rails-v6

Gracias.

Jaime Mora R.

Localization Simplified [1] es lo que necesito para resolver esto ?, Qué
opinan al respecto, me gustaría conocer sus comentarios.

[1] http://www.agilewebdevelopment.com/plugins/localization_simplified

Gracias … saludos

Jaime Mora R.

No sé si te estás complicando demasiado o no te entiendo bien.

Yo para eso pongo en environment.rb:

ActiveRecord::Errors.default_error_messages = {
:inclusion => “no está incluido en la lista”,
:exclusion => “está reservado”,
:invalid => “es inválido”,
:confirmation => “no coincide la confirmación”,
:accepted => “debe ser aceptado”,
:empty => “no puede estar vacío”,
:blank => “no puede estar vacío”,
:too_long => “demasiado largo (máximo %d caracteres)”,
:too_short => “demasiado corto (mínimo %d caracteres)”,
:wrong_length => “longitud inválida (debería ser de
%d
caracteres)”,
:taken => “ya existe ese nombre en la base de datos”,
:not_a_number => “no es un número”
}

Con esto los mensajes por defecto salen en español.

Y si quieres hacer un mensaje para una validación en concreto, pones en
el
modelo:

validates_presence_of :loquesea, :message => “El mensaje que quieras”

Luis V. wrote:

No sé si te estás complicando demasiado o no te entiendo bien.

Gracias Luis. Aprovechando de tu nobleza -:)), ¿ Cómo puedo traducir los
mensajes que envía Rails en la lista resúmen de errores ? : “2 errors
prohibited this cuenta from being saved” y “There were problems with the
following fields:”

Gracias por tu valiosa ayuda.
Saludos.

Jaime Mora R.

Luis V. wrote:

Pues así lo hice yo.

Solucionado !!!. Por supuesto que me sirve, que tengas un buen dia.

Gracias … saludos

Jaime Mora R.

Pues así lo hice yo.

En application_helper:

def error_messages_for(object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")
if object && !object.errors.empty?
content_tag(“div”,
content_tag(
options[:header_tag] || “h2”,
“Imposible guardar #{object_name.to_s.gsub(”_", " “)}”
) +
content_tag(“p”, “Los siguientes campos han tenido problemas:”) +
content_tag(“ul”, object.errors.full_messages.collect { |msg|
content_tag(“li”, msg) }),
“id” => options[:id] || “errorExplanation”, “class” =>
options[:class] || “errorExplanation”
)
else
“”
end
end

Espero que te sirva. Un saludo