2013-08-09 11 views
38

ho aggiunto una convalida di un oggetti utilizzando:Qual è la differenza tra "validate" e "validates"?

validate :field, presence: true 

ho trovato non danno messaggi di errore. Li ho modificati in validates e ho ricevuto i messaggi di errore. This ticket è rilevante.

ho cercato di aggiungere una convalida personalizzata con validates e ottenuto un errore:

You need to supply at least one validation 

ho cambiato in validate, e tutto è andato avanti come previsto.

La mia comprensione è di utilizzare validates con convalide normali e validate con quelle personalizzate. È giusto? Ci sono altri pezzi che dovrei sapere? C'è un modo per far fallire a squarciagola il primo problema e non solo per validare tutto?

+0

forse uno è sintassi convalida personalizzata 'validate' e altro è la validazione generico' validates' sintassi – Viren

+0

@Viren - sono solo chiedendosi se mi mancasse qualcos'altro Non ero in grado di trovare una spiegazione chiara dei due e spero che SO possa fornire. Sono d'accordo, questa è l'unica differenza che ho trovato finora. –

+0

Ho risposto tenendo presente il problema del faro :) – Viren

risposta

54

valida Questo metodo è una scorciatoia per tutti i validatori predefiniti e tutte le classi di convalida personalizzate che terminano in "Validator". Nota che i validatori predefiniti di Rails possono essere sovrascritti all'interno di classi specifiche creando classi di validatori personalizzati al loro posto, ad esempio PresenceValidator.

validates :title, :body, :presence => true 

convalidare, aggiunge un metodo di convalida o il blocco alla classe. Questo è utile quando l'override del metodo di istanza valido diventa troppo pesante e stai cercando una dichiarazione più descrittiva delle tue convalide.

validate :must_be_friends 

    def must_be_friends 
    errors.add(:base, 'Must be friends to leave a comment') unless commenter.friend_of?(commentee) 
    end 
+0

di 'curiosity' che doc puoi collegare e anche tu l'hai provato AFAIK non funziona – Viren

+0

rivisto la mia risposta :) questo: http: // apidock .com/rails/ActiveModel/Validations/ClassMethods/validates Ho letto gli esempi in basso e questo è quello che ho capito, ma sembra che ho sbagliato. Quelle più descrittive http://api.rubyonrails.org/classes/ActiveModel/Validations/ClassMethods.html – rmagnum2002

+1

Oh, non sapevo nulla delle "classi di validatori personalizzati che terminavano in" Validator "", questo è molto buono sapere . Lascerò la domanda aperta per un po 'più a lungo nel caso sorgano altre risposte, ma tornerò più tardi ad accettare. Grazie per la spiegazione! –

6

credo che la dichiarazione :validate viene utilizzato per personalizzato convalida in cui come :validates viene utilizzato per generico convalida come presence, uniqueness etc su un campo

Il metodo validate cerca un metodo con il nome del parametro, cioè se lo fai validate :field cercherà

def field 

end 

sul tuo object. Poiché Rails definisce un attr_accessor per ogni database field, il validate :field chiamerebbe il metodo di lettura di field.

Se la funzione di convalida restituisce true o se v'è un oggetto error, cioè object.errors non è vuota, allora l'oggetto è considerato valid?

qui la ragione in ligthouse questione, essi addebitano validatesilently bypasses la convalida :)

Spero che questo ha senso

+0

Ah, grazie per questa spiegazione! Non ci avevo pensato in quel modo, ma ha perfettamente senso. Spiega anche perché non si può avere il ': validate' fail" loudly "dato che è perfettamente ragionevole (si potrebbe anche dire" valido "...) call to make. Non ci avevo pensato in quel modo. –

+0

** Questo è estremamente importante. ** _Seriously_ i risultati inaspettati sono solo un singolo personaggio lontano. Grazie per aver pubblicato non solo il "gotcha", ma anche la scienza dietro. Saluti! –

Problemi correlati