How to separate change password from devise form

change-password, devise, forms, ruby-on-rails

Solution

Did you bother to check out Devise wiki? There are examples for both this cases

- https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

- https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password

You should be looking at `@user.update_with_password(params[:user])` vs `@user.update_attributes(params[:user])`

Problem

I am trying to do two things: 1) Change the default "edit user form" - provided with devise - to remove "password" and allow the other fields to be updated without having to enter a password ie remove the default validation for password. 2) Create a separate form for changing password I have got everything to work, there is only one problem, in the separate form for updating password, I have included a field for current password. When using the form, no validation is made for current password, so I changed ``` @user.update_attributes(params[:user]) ``` to ``` @user.update_with_password(params[:user]) ``` This worked, however it raised another issue. Back in the main form with all the other details except password, the form now asks for a "current password". How can I achieve this without a validation for current password being called on the main form? here is my registrations controller: ``` def update @user = User.find(current_user.id) if @user.update_attributes(params[:user]) set_flash_message :notice, :updated # Sign in the user bypassing validation in case his password changed sign_in @user, :bypass => true redirect_to after_update_path_for(@user) else clean_up_passwords(resource) respond_with_navigational(resource) do if params[:change_password] # or flash[:change_password] render :change_password else render :edit end end end end ``` Thanks! Solution 1 I have found a solution to the problem (albeit a very messy one): ``` def update @user = User.find(current_user.id) if params[:user][:password].blank? if @user.update_attributes(params[:user]) set_flash_message :notice, :updated # Sign in the user bypassing validation in case his password changed sign_in @user, :bypass => true redirect_to after_update_path_for(@user) else respond_with_navigational(resource) do render :edit end end else if @user.update_with_password(params[:user]) set_flash_message :notice, :updated # Sign in the user bypassing validation in case his password changed sign_in @user, :bypass => true redirect_to after_update_path_for(@user) else clean_up_passwords(resource) respond_with_navigational(resource) do render :change_password end end end ``` Solution 2 Can you suggest a better solution?

Original source