Supongo que su cantidad en dólares es de tipo decimal. Por lo tanto, cualquier valor que el usuario ingrese en el campo se envía desde la cadena al tipo apropiado antes de guardarlo en la base de datos. La validación se aplica a los valores ya convertidos a tipos numéricos, por lo que Regex no es realmente un filtro de validación adecuado en su caso.
Usted tiene dos posibilidades para resolver esto, sin embargo:
- Uso
validates_numericality_of
. De esta forma, deja la conversión completamente en Rails y simplemente verifica si la cantidad está dentro de un rango determinado.
- Utilice el método
validate_each
y codifique su lógica de validación usted mismo (por ejemplo, verifique si el valor tiene más de 2 dígitos decimales).
- Validar la attribute before it's been typecasted:
Esto es especialmente útil en situaciones de validación donde el usuario podría suministrar una cadena para un campo entero y desea mostrar la cadena original de nuevo en un error mensaje. Acceder al atributo normalmente encasillaría la cadena en 0, que no es lo que desea.
Así, en su caso, debe ser capaz de utilizar:
validates_format_of :amount_before_type_cast, :with => /^[0-9]+\.[0-9]{2}$/, :message => "must contain dollars and cents, seperated by a period"
Nótese, sin embargo, que los usuarios podrían encontrar aburrido de seguir sus reglas rígidas para el ingreso (I realmente preferiría poder tipo 500
en su lugar 500.00
, por ejemplo), y que en algunos lugares el período no es un separador decimal (si alguna vez planea internacionalizar su aplicación).
¿Alguna razón por la que no utiliza 'validates_numericality_of' en lugar de una expresión regular? –
¿Cómo usaré 'validates_numericality_of' para asegurar que 500.001 fallaría? Solo quiero, específicamente formateado, '[cualquier número de dígitos 0 a 9]. [2 de cualquier dígito 0 a 9]' - usando así 'validates_format_of: amount,: with =>/^ [0-9] + \.[0-9] {2} $ /,: mensaje => "debe contener dólares y centavos, separados por un período" ' –