2011-02-22 8 views
10

Los aeropuertos tienen códigos ICAO de cuatro letras. Por convención, estos son siempre en mayúsculas. Estoy creando un formulario para recibir información del usuario, pero este formulario debe poder aceptar las entradas del usuario en mayúsculas y minúsculas e impedir que creen duplicados.Rieles: campo de fuerza mayúscula y validación única

El valor predeterminado :uniqueness distingue entre mayúsculas y minúsculas, por supuesto. Descubrí cómo transformar la entrada del usuario en mayúscula antes de que se guarde, pero el problema es que parece ser una validación posterior, en lugar de una validación previa.

Por ejemplo, si ya hay un aeropuerto con ICAO de KLAX, un usuario puede ingresar klax, se validará como único, y luego se transformará a mayúsculas y se almacenará, lo que generará duplicados.

Aquí está el código de mi modelo en este momento.

class Airport < ActiveRecord::Base 
    validates :icao, :name, :lat, :lon, :presence => true 
    validates :icao, :uniqueness => true 

    before_save :uppercase_icao 

    def uppercase_icao 
    icao.upcase! 
    end 
end 

Respuesta

2

Simplemente fijo (como muchos de los problemas con los carriles son) - Danny como se ha señalado anteriormente, aunque no en su propia respuesta, así que puede no acepto :), cambiando before_save a before_validation lo arregla perfectamente.

7

probar esto:

validates :icao, :uniqueness => { :case_sensitive => false } 
+2

o hacer una before_validation en lugar de before_save :) –

+1

perfecto, Danny - before_validation es exactamente lo que necesitaba. – tkrajcar

9

O una visión ligeramente diferente: Escribir un colocador de icao que convierte cualquier cosa lanzada contra él en mayúsculas:

def icao=(val) 
    self[:icao] = val.upcase 
end 

Y a continuación, puede utilizar la validación de singularidad regular (back it up with a unique index in your DB). Incluso podría hacer las cosas un poco más fáciles para el DB durante los hallazgos, porque ya no tiene que preocuparse por las comparaciones insensibles a mayúsculas y minúsculas.

Espero que esto ayude!

+0

Gracias, una forma interesante de manejarlo también. También, por alguna razón, no asumí que necesitaría indexar mis campos manualmente, así que es muy bueno saberlo. ¡Fácil de hacer, pero importante! ¡Gracias! – tkrajcar

5

respuesta actualizada para rieles 4.

class Airport < ActiveRecord::Base 
    validates :icao, :name, :lat, :lon, :presence => true 
    validates :icao, :uniqueness => { case_sensitive: false } 

    def icao=(val) 
    write_attribute :icao, val.upcase 
    end 
end 
Cuestiones relacionadas