2009-11-04 17 views
11

Ho un modello Utente con gli attributi usuali come email e hashed_password ecc. Voglio scrivere una convalida che controlli la presenza di un indirizzo di posta elettronica, ma solo quandoConvalida Rails per gli utenti email - vuole solo che si convalidi quando un utente si iscrive o aggiorna l'indirizzo email

1) non v'è quella memorizzata nel database per questo oggetto (vale a dire che questo è un nuovo utente la firma)

2) l'utente sta cercando di aggiornare il proprio indirizzo e-mail .

miei convalide attuali

validates_presence_of :email 
    validates_presence_of :email_confirmation 

    validates_confirmation_of :email 

sono ovviamente mi impediscono di aggiornare tutti gli attributi. Ho pensato di utilizzare

validates_presence_of: email,: if: email_validation_required?

def email_validation_required? 
self.email.blank? 
end 

Ma che aiutano solito con lo scenario 2 in quanto restituirà true perché l'utente ha un password dell'indirizzo e-mail nel db.

Non riesco a capire come posso limitarlo solo a quei 2 scenari sopra.

Qualcuno può aiutare?

risposta

18

Penso che l'EmFi sia a qualcosa. Ma non penso che lo validates_presence_of :email debba tenerti sollevato. email dovrebbe essere sempre presente: se viene lasciato vuoto nel modulo, il parametro non interferirà con il salvataggio dell'utente. Se è inserito nel modulo, anche per l'aggiornamento, dovrebbe avere un email_confirmation insieme per la corsa.

dare una prova:

validates_presence_of :email 
validates_presence_of :email_confirmation, :if => :email_changed? 

validates_confirmation_of :email 
+0

scusa per la risposta tardiva Barry, il tuo diritto al riguardo non mi trattiene. Stavo solo replicando il codice per password_confirmation per email_confirmation ma questo ha requisiti diversi. Grazie per segnalarlo. – robodisco

10

avete due opzioni. uno è quello di utilizzare :on. Per impostazione predefinita, sono impostati a , ma si può fare qualcosa di simile questo

validates_presence_of :email, :on => :create 

o

validates_presence_of :email, :on => :update 

le altre opzioni è quello di utilizzare :if e quindi passare in nome di un metodo o un proc . così qualcosa come

validates_presence_of :email, :if => :should_validate 

o

validates_presence_of :email, :if => Proc.new { |user| user.signup_stage > 2 } 

Speranza che aiuta :)

+0

hi opaco grazie per voi aiuto. Avevo pensato di usare un metodo con: se non mi fossi accorto su come scrivere la logica al suo interno. Mi stavo chiedendo se ci fosse un modo senza dover introdurre più attributi al mio modello. Ho notato nel tuo ultimo esempio che hai citato un attributo signup_stage. – robodisco

+0

Stavo solo dando esempi piuttosto generici. Sulla rilettura della tua domanda, perché l'email sarà vuota nel tuo modello se l'utente ha una password nel db? –

+0

scusa che la password era un errore di battitura - dovrebbe aver letto l'email. Modificato il post. – robodisco

3

Si desidera utilizzare una: se clausola sulla convalida che utilizza l'ActiveRecord :: sporca metodi:

validates_presence_of :email, :if => Proc.new { |user| user.email_changed?} 

NB Funziona solo in Rails 2.1 o versioni successive.

Problemi correlati