2011-05-20 20 views

Respuesta

36

2 cosas:

  1. Los mensajes de validación utilizan el Rails I18n style interpolation, que es %{value}
  2. La clave es value en lugar de name, porque en el contexto de la internacionalización, que realmente no se preocupan por el resto del modelo.

Así que el código debe ser:

validates_uniqueness_of :name, :message => '%{value} has already been taken' 
+1

¡Agradable! Definitivamente más limpio que mi respuesta. –

+1

Puede ser útil saber que% {attribute} también está disponible para su uso. – zwalker

+0

'% {value}' ya no funciona en Rails 4. :( –

16

parece que yo Puede pasar un Proc al mensaje. Al hacer esto, se obtienen dos parámetros:

  1. Un símbolo en la línea de :activerecord.errors.models.user.attributes.name.taken
  2. Un hash que se ve algo como `{: Modelo => "Usuario",: atributo => "Nombre", : valor => "Mi nombre"}

Así que si usted permite que durante dos parámetros en un proc, se puede utilizar el elemento attributes[:value] para obtener el nombre que se utilizó:

validates_uniqueness_of :name, 
         :message => Proc.new { |error, attributes| 
          "#{attributes[:value]} has already been taken." 
         } 
3

¿Qué versión de Rails utiliza?

Si Rails 3. entonces entiendo que debe usar :message => '%{value} has already been taken'. No estoy seguro acerca de Rails 2.3. - pero en cualquier caso, puede crear su propia validación personalizada que realice lo que necesita.

+0

para esta aplicación, estoy usando rails 2.3.4 – umar

Cuestiones relacionadas