Here is my suggestion.

Have your User model ignore attempts to set a blank password:

def password=(value)
  super(value) unless value.empty?
end

And then change your controller to:

if @user.update_attributes(params[:user])
  flash[:success] = "Profile updated."
  redirect_to @user
else
  flash[:failure] = "ERROR: Profile NOT updated."
  @title = "Edit user"
  render :action => "edit"
end

If you have validations you may have to tweak them a bit.


On Jan 5, 12:54 pm, Michael Pavling <[email protected]> wrote:
> On 5 January 2012 17:37, Allen Maxwell <[email protected]> wrote:
>
> > I've worked around this by using a bunch of ugly if statements to update 
> > each field individually (not elegant but got the job done when i was first 
> > learning)  It is UGLY and not robust so i need to refactor (and improve) 
> > it.  Here's what i have:
>
> GAH! That certainly is ugly :-)
>
> How does your new approach work now if the user *does* try to change
> their password?...
>
> First off, there's no need for all the nesting, just chain them if you
> insist on stuff like this:
>
> if @user.update_attribute( :name, params[:user][:name]) &&
>  @user.update_attribute( :email, params[:user][:email] ) &&
>  @user.update_attribute( :admin, params[:user][:admin] ) &&
>  @user.update_attribute( :teamleader, params[:user][:teamleader] ) &&
>  @user.update_attribute( :street, params[:user][:street] ) &&
>  @user.update_attribute( :city, params[:user][:city] ) &&
>  @user.update_attribute( :state, params[:user][:state] ) &&
>  @user.update_attribute( :zip, params[:user][:zip] ) &&
>  @user.update_attribute( :login, params[:user][:login] ) &&
>  @user.update_attribute( :startdate, params[:user][:startdate] ) &&
>  @user.update_attribute( :fname, params[:user][:fname] ) &&
>  @user.update_attribute( :lname, params[:user][:lname] ) &&
>     flash[:success] = "Profile updated."
>     redirect_to @user
> else
>     flash[:failure] = "ERROR: Profile NOT updated."
>     @title = "Edit user"
>     render :action => "edit"
> end
>
> > but i could use some advice on a better way to go :)
>
> You could add some checks to remove the password (and confirmation)
> field from the params[:user] hash if there's not been a password
> entered. And/or some validation checks in the model that only run the
> password validations if a new password and/or confirmation has been
> provided. Or you could take your user params hash and assign each
> entry to it's attribute and then call "save" (and only update the
> password and confirmation if they're not blank in params).... all
> sorts of ways.... but probably _not_the way you've chosen ;-)
>
> PS Beware that all those "update_attribute" calls *don't* run validations...

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to