2011-02-08 10 views
13

hihorails 3 convalida di una stringa

C'è un modo per dire ai binari che la mia stringa potrebbe non essere "qualcosa"?

Sto cercando qualcosa di simile

validates :string, :not => 'something' 

grazie klump

risposta

22

Uno di questi farà il lavoro (clicca sui metodi per la documentazione):

  1. Probabilmente il miglior e più veloce, facile da estendere per altre parole:

    validates_exclusion_of :string, :in => %w[something] 
    
  2. Questo ha un vantaggio di utilizzare un regexp, in modo da poter generalizzare facile:

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

    È possibile estendere ad altre parole con /\A(something|somethingelse|somemore)\Z/

  3. Questo è il caso generale con il quale è possibile ottenere alcuna convalida:

    validate :cant_be_something 
    def cant_be_something 
        errors.add (:string, "can't be something") if self.string == "something" 
    end 
    
  4. per ottenere esattamente la sintassi avete proposto (validates :string, :not => "something") si può usare questo codice (un avvertimento però, l'ho scoperto mentre leggevo il ramo principale del rails source e dovrebbe funzionare, ma non funziona sulla mia ~ 3 mesi di installazione). Aggiungere questo da qualche parte nel vostro percorso:

    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 Roba buona! Penso che le nostre risposte siano convergenti :) –

+0

Sì, immagino che entrambe le abbiamo trattate in modo abbastanza esaustivo;) L'uso di '\ A' e' \ Z' è probabilmente un'idea più sicura - buona presa. –

7

un paio di modi. Se si dispone di lista esatta di ciò che non può essere:

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

Se si vuole assicurare che non esiste come una sottostringa a tutti:

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

Se è più complicato e vuoi nascondere i dettagli disordinati:

validate :not_something 

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