Ottieni convalide di un modello Rails
-
05-07-2019 - |
Domanda
Dato un modello che ha validazioni nel file model_name.rb, come posso accedere a quelle validazioni manualmente? Vorrei preparare il mio sistema di convalida dei moduli che funzionerebbe a fianco dei trucchi Rails integrati e voglio mantenere tutto il più ASCIUTTO possibile. Il mio problema principale è che devo effettuare convalide sul lato server prima che uno qualsiasi dei valori del modulo raggiunga il database (sto usando un modulo a più fasi).
Fondamentalmente mi chiedo se esiste un metodo come
User.validations.each do |v|
puts v.constraint.to_s + " " + v.message
end
C'è qualcosa di simile a questo?
Grazie in anticipo.
Soluzione
Il mio problema principale è che devo fare convalide lato server prima di una delle i valori del modulo colpiscono il database (lo sono utilizzando un modulo a più fasi).
Se il tuo modello non è valido in base alle convalide nel suo file di classe, i suoi dati non verranno salvati nel database (a meno che non passi false
nel save
metodo per sopprimere le convalide).
- Puoi chiedere a un modello se è valido in qualsiasi momento invocando i metodi
validi?
/non validi?
.
Altri suggerimenti
L'oggetto ActiveRecord espone il metodo degli errori dopo che è valido? viene chiamato, che fornisce messaggi sui quali vengono violate le convalide. Potresti verificare valido? e quindi controlla se uno dei campi nella parte del modulo in cui ti trovi non è valido. potresti fare qualcosa del genere per un modulo con campi field1 e field2.
unless x.valid?
[:field1,:field2].each do |field|
yes_there_was_an_error if x.errors[field]
end
end
La soluzione migliore è utilizzare una macchina a stati e archiviare i dati nel database tra le varie fasi del modulo.
Puoi fare ad es. validates_presence_of: username,: if = > proc {| u | u.signup_step > = 2}
, dove signup_step
è una colonna intera nel database.
Quindi, anche se dici che non vuoi memorizzarlo nel database tra i moduli, penso che dovresti. Se lo fai, puoi utilizzare convalide e modelli regolari, senza attacchi dannosi. E onestamente, dubito che farlo in questo modo sia un problema.