Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/03/2008, 11:40
el_ro
 
Fecha de Ingreso: marzo-2007
Mensajes: 134
Antigüedad: 17 años, 8 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