Validare la modifica di un utente

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 :slight_smile:

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’.

per le password sto utilizzando
<%= password_field :user, “password” %>
e
<%= password_field :user, “password_confirmation” %>

e tramite un before_save callback cripto la pass con md5.

provo a guardare che query fa…

Il 01/05/07, Rob C. [email protected] ha scritto:

stiamo parlando del model USER che per comodità avra solo username e

end

vega 4 - burn and fade away


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

confermo che praticamente active records chiama la stessa query fatta da
me… meglio cosi :slight_smile:

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

mentre il form è cosi

Username:

<%= text_field :user, :username %>


Password:

<%= password_field :user, “password” %>


Confirm password:

<%= password_field :user, “password_confirmation” %>

è una cosa alquanto strana… facendo un redirect dovrebbe ricaricare
l’oggetto dalla session e non da params…

thanks

Il 01/05/07, tarini [email protected] ha scritto:

oggettivamente è presente nel db.
username, id])
everything has got to end sometime we were satellites drifting off
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

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”

avete qualche idea in merito??

cosi facendo però mi si incazza il validatore :frowning: :frowning:

Il 15/05/07, Giovanni I. [email protected] ha scritto:

#password on update
la validazione funziona perfettamente, l’unica problema è appunto
http://lists.ruby-it.org/mailman/listinfo/ml


Ml mailing list
[email protected]
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away

Puoi fare
così:
updated_attributes = params[:user]
updated_attributes.delete(:password) if updated_attributes
[:password].blank?
@user.update_attributes(updated_attributes)

C’è sicuramente un metodo più veloce ma non mi viene in mente adesso :slight_smile:

Il giorno 15/mag/07, alle ore 17:09, tarini ha scritto:

In che modo?

Il giorno 15/mag/07, alle ore 17:31, tarini ha scritto:

il problema della validazione è risolto (ho deletato anche
password_confirm)
ora mi sto incasinando con la criptazione “ricorsiva”

per adesso grazie :slight_smile:

Il 15/05/07, Giovanni I. [email protected] ha scritto:

updated_attributes = params[:user]

def update
con le seguenti validazioni nel modello
validates_presence_of :password, :on => :update, :if =>
quello

into
http://lists.ruby-it.org/mailman/listinfo/ml


everything has got to end sometime we were satellites drifting off into
space
vega 4 - burn and fade away