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
on 20.02.2007 02:09
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
on 21.02.2007 09:52
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"
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
on 21.02.2007 17:15
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
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