Ruby Forum Rails-ES > Traducción mensajes de validación ActiveRecord

Posted by Jaime Mora Ramones (moctan)
on 20.02.2007 02:09
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' %>

<!--[form:cuenta]-->
<p><%= error_message_on(:cuenta, :banco) %><label
for="cuenta_banco">Banco</label><br/>
<%= text_field 'cuenta', 'banco'  %></p>

<p><%= error_message_on(:cuenta, :banco) %><label
for="cuenta_tipo">Tipo</label><br/>
<%= text_field 'cuenta', 'tipo'  %></p>
<!--[eoform:cuenta]-->

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 Ramones
Posted by Jaime Mora Ramones (moctan)
on 20.02.2007 18:53
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 Ramones
Posted by Luis Villegas (Guest)
on 21.02.2007 09:52
(Received via mailing list)
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&aacute; incluido en la lista",
      :exclusion => "est&aacute; reservado",
      :invalid => "es inv&aacute;lido",
      :confirmation => "no coincide la confirmaci&oacute;n",
      :accepted  => "debe ser aceptado",
      :empty => "no puede estar vac&iacute;o",
      :blank => "no puede estar vac&iacute;o",
      :too_long => "demasiado largo (m&aacute;ximo %d caracteres)",
      :too_short => "demasiado corto (m&iacute;nimo %d caracteres)",
      :wrong_length => "longitud inv&aacute;lida (deber&iacute;a ser de 
%d
caracteres)",
      :taken => "ya existe ese nombre en la base de datos",
      :not_a_number => "no es un n&uacute;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"
Posted by Jaime Mora Ramones (moctan)
on 21.02.2007 16:52
Luis Villegas 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 Ramones
Posted by Luis Villegas (Guest)
on 21.02.2007 17:15
(Received via mailing list)
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
Posted by Jaime Mora Ramones (moctan)
on 21.02.2007 17:56
Luis Villegas wrote:
> Pues así lo hice yo.

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

Gracias ... saludos
---
Jaime Mora Ramones