salve ragazzi, eccomi di nuovo a chiedere un vostro parere riguardo ad
un
problema credo abbastanza comune.
stiamo parlando del model USER che per comodità avra solo username e
password.
i campi sono entrambi richiesti (validates_presence_of), la password
necessita di conferma (validates_confirmation_of) e lo username deve
essere
unico (validates_uniqueness_of).
il problema sorge in fase di update di un utente in quanto il
validates_uniqueness_of giustamente si “incazza” perchè il nickname
oggettivamente è presente nel db.
dite che questa può essere una valida soluzione?
def validate_on_create
validates_uniqueness_of(:username, :message => “is already used!”)
end
def validate_on_update
if User.find(:first, :conditions => [“username = ? and id <> ?”,
username, id])
errors.add(:username, “is already used”)
end
end
thanks
PS è giusto che il campo password viene valorizzato utilizzando
password_field ?
–
everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away
Sì, il nickname è presente nel db ma RoR controlla già se un’altro
utente ha questo nickname e praticamente fa la ricerca che hai messo
tu. Nel development.log (o test.log) puoi vedere i query che RoR fa
quando fa il validation. Hai controllato i dati che hai nel db? Forse
stai usando un ‘fixture’ con ha il nickname?
Non credo che sia un problema usando il campo password_field ma stai
usando anche un campo password? In ogni caso sarebbe meglio non
salvare il password come ‘plain text’.
confermo che praticamente active records chiama la stessa query fatta da
me… meglio cosi
ora ho altro problema alquanto strano: quando salvo faccio un redirect
alla
stessa action settando un messaggio flash per segnalare l’avvenuta
modifica.
quando ricarico la pagina però viene valorizzato anche il campo
password_confirmation (!!!) con la password non criptata.
ecco il metodo
#update current user
def update @user = session[:user]
if request.post?
if @user.update_attributes(params[:user])
flash[:notice] = “User updated”
redirect_to :action => :update
end
end
end
hmm molto strano. Sei sicuro che l’utente viene modificato? Nel caso
in cui non viene modificato (per i validazione), la pagine viene
caricato senza fare redirect o refresh.
ho risolto molti problemi con un :if nelle validazioni
ora sorge però l’ultimo problema
praticamente nel controller dovrei “annullare” il parametro :password
nel caso sia blank perchè altrimenti con update_attributes ActiveRecords
mi annulla la password
ora uso un metodo di questo tipo:
def update @user = session[:user]
if request.post?
if @user.update_attributes(params[:user])
flash[:notice] = “User updated”
session[:user] = @user
redirect_to :action => :update
end
end
end
con le seguenti validazioni nel modello #username
validates_presence_of :username, :message => “cannot be blank”
validates_uniqueness_of :username, :message => “is already used!” #password on create
validates_presence_of :password, :message => “cannot be blank”, :on =>
:create
validates_confirmation_of :password, :on => :create, :message =>
“doesn’t match!” #password on update
validates_presence_of :password, :on => :update, :if =>
:password_required?, :message => “cannot be blank!”
validates_confirmation_of :password, :on => :update, :if =>
:password_required?, :message => “doesn’t match!”
protected
def password_required?
!password.blank?
end
la validazione funziona perfettamente, l’unica problema è appunto quello
della password che se blank viene “annullata”