2010-11-12 9 views
8

Quiero ver el valor no válido en el mensaje de validación.Los rieles anulan el mensaje de validación

validates_uniqueness_of :event, :scope => :user_id 

Resultado: "Título ha ya ha sido tomada" Quiero: "Evento # {evento} ya ha sido tomada por # {usuario}"

que estoy tratando de hacerlo de esta manera, pan no trabaja:

validates_uniqueness_of :event, :scope => :user_id, :message=>"#{self.event} already has been taken by #{self.user}" 
+0

Supongo que 'evento' es otra clase de modelo activo? –

+0

Solo por ejemplo. no en el proyecto real – murato

Respuesta

11

Desde el ActiveRecord código fuente comentario:

Los valores: modelo,: atributos y : valor están siempre disponibles para El valor de interpolación: recuento es disponibles en su caso. Se puede usar para la pluralización.

Así que simplemente hay que escribir su mensaje como

validates_uniqueness_of :event, :scope => :user_id, 
         :message=>"{{value}} is already taken" 
+1

Gracias '. Funciona, pero necesita escribir {{value}} – murato

+0

Gracias, pero ¿hay alguna manera de hacer que el resultado '% {model}' sea un nombre de modelo separado por espacios en lugar del nombre del modelo con solo la primera letra en mayúscula? es decir. RocketScience se imprime como Rocketscience, pero estaría satisfecho con Rocket Science o con la ciencia de cohetes cuando use '% {model}' en mi interpolación. – mkelley33

5

utilizan una lambda:

validates_uniqueness_of :event, :scope => :user_id, :message=> lambda { |e| "#{e.event} already has been taken by #{e.user}"} 
+0

Esto genera un error en Rails4 –

5

Bueno, en realidad en Rails 3.x no es ni% {{valor}} {{ni}} valor pero% {valor}.

6

Utilice una lambda, pero al menos en las versiones más recientes de Rails, ActiveRecord intentará pasar dos parámetros a esa lambda, y necesita dar cuenta de ellos. Utilizando un ejemplo sencillo, supongamos que queremos asegurar un nombre de usuario sólo contiene caracteres alfanuméricos:

validates_format_of :username, :with => /^[a-z0-9]+$/i, 
    :message => lambda{|x,y| "must be alphanumeric, but was #{y[:value]}"} 

El primer parámetro pasado a la lambda es un no tan pequeño símbolo extraño que sería grande para decirle a un robot lo salieron mal:

:"activerecord.errors.models.user.attributes.username.invalid" 

(En caso de que usted está confundido por la notación anterior, los símbolos pueden contener más que sólo letras, números y guiones bajos, pero si lo hacen, usted tiene que poner comillas alrededor de ellos porque de lo contrario. :activerecord.errors parece que está intentando llamar al método .errors en una llamada de símbolo ed :activerecord.)

El segundo parámetro contiene un hash con los campos que le ayudarán a "actualizar" la respuesta de error. Si trato de agregar un nombre de usuario con signos de puntuación como "¡Superestrella!", Se verá algo como esto:

{ 
    :model=>"User", 
    :attribute=>"Username", 
    :value=>"Superstar!!!" 
} 
Cuestiones relacionadas