Foros del Web » Programando para Internet » Ruby »

Cambiar las clases de rubyonrails

Estas en el tema de Cambiar las clases de rubyonrails en el foro de Ruby en Foros del Web. Buenas muchachos.. tengo una duda aca... como hago para modificar el metodo validates_presence_of de la clase ActiveRecord::Validations::ClassMethods de manera que cuando me imprima el error ...
  #1 (permalink)  
Antiguo 04/03/2008, 13:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 9 meses
Puntos: 0
Cambiar las clases de rubyonrails

Buenas muchachos.. tengo una duda aca... como hago para modificar el metodo validates_presence_of de la clase ActiveRecord::Validations::ClassMethods de manera que cuando me imprima el error no me muestre el campo al que esta asociado el error.. espero que alguien me pueda ayudar..
  #2 (permalink)  
Antiguo 09/03/2008, 11:40
 
Fecha de Ingreso: marzo-2007
Mensajes: 134
Antigüedad: 17 años, 9 meses
Puntos: 1
Re: Cambiar las clases de rubyonrails

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.
__________________
http://www.gritala.net/botones >> Intercambia enlaces con Gritala.net :p

http://www.agregala.com >> Envía tus noticias y gana enlaces y visitas!

Última edición por el_ro; 09/03/2008 a las 11:47
  #3 (permalink)  
Antiguo 12/03/2008, 09:57
 
Fecha de Ingreso: febrero-2008
Mensajes: 8
Antigüedad: 16 años, 9 meses
Puntos: 0
Re: Cambiar las clases de rubyonrails

Muchisimas gracias.. ahora seguiremos adelante con el proyecto...
  #4 (permalink)  
Antiguo 10/04/2008, 13:04
 
Fecha de Ingreso: abril-2008
Mensajes: 21
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: Cambiar las clases de rubyonrails

Hola melj_mat, tal vez este plugin tambien te pueda ser util:

http://rubyforge.org/projects/custom-error-message/

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:04.