2011-02-08 11 views
13

hihorieles 3 validación de una cadena

¿Hay alguna manera de decirle a los rieles que mi cadena puede no ser "algo"?

Estoy buscando algo así como

validates :string, :not => 'something' 

gracias klump

Respuesta

22

Cualquiera de estos puede hacer el trabajo (click sobre los métodos para la documentación):

  1. Probablemente la mejor y la manera más rápida, fácil de extender para otras palabras:

    validates_exclusion_of :string, :in => %w[something] 
    
  2. Esto tiene una ventaja de utilizar una expresión regular, por lo que se puede generalizar más fácil:

    validates_format_of :string, :without => /\A(something)\Z/ 
    

    Se puede extender a otras palabras con /\A(something|somethingelse|somemore)\Z/

  3. Este es el caso general con el que se puede lograr ninguna validación:

    validate :cant_be_something 
    def cant_be_something 
        errors.add (:string, "can't be something") if self.string == "something" 
    end 
    
  4. para obtener exactamente la sintaxis que se propuso (validates :string, :not => "something") que puede utilizar este código (una advertencia, sin embargo, descubrí esto mientras leía la rama principal de la fuente de los rieles y debería funcionar, pero no funciona en mi ~ 3 meses de edad instale). Añadir esto en alguna parte en su camino:

    class NotValidator < ActiveModel::EachValidator 
        def validate_each (record, attribute, value) 
        record.errors[attribute] << "must not be #{options{:with}}" if value == options[:with] 
        end 
    end 
    

+0

+1 ¡Buenas cosas! Creo que nuestras respuestas están convergiendo :) –

+0

Sí, supongo que ambos lo cubrimos bastante exhaustivamente;) Usar '\ A' y' \ Z' es probablemente una idea más segura: buena captura. –

7

un par de maneras. Si tiene lista exacta de lo que no puede ser:

validates_exclusion_of :string, :in => ["something", "something else"] 

Si desea asegurarse de que no existe como una subcadena en absoluto:

validates_format_of :string, :with => /\A(?!something)\Z/ 

Si es más complicado y desea ocultar los detalles desordenados:

validate :not_something 

def not_something 
    errors.add(:string, "Can't be something") if string =~ /something/ 
end 
Cuestiones relacionadas