简体   繁体   中英

Devise: Allow users to edit their account without providing a password BUT also use 'reconfirmable' functionality

I've been following this how-to in the Devise wiki...

How To: Allow users to edit their account without providing a password

...to enable my users to change the account credential and update without providing their existing password.

However, I also want to use the Confirmable modules reconfirmable functionality

Even though I have config.reconfirmable = true set in my devise initializer file the controller doesn't seem to be sending the reconfirmable emails.

Any ideas what's wrong?

The issue was that the controller in the original How-to had various missing Devise methods required by the Confirmable module.

To get it to work I had to use as much of the original update action as possible from the Devise::RegistrationsController and also override the update_resource(resource, params) action so that it didn't need a password to update the record.

So my bespoke RegistrationsController now looks like this:

class Users::RegistrationsController < Devise::RegistrationsController

  def update
    update_params = account_update_params
    # required for settings form to submit when password is left blank
    if update_params[:password].blank?
      [:password,:password_confirmation,:current_password].collect{|p| update_params.delete(p) }
    end
    if update_params[:password].present? and update_params[:current_password].blank?
      [:current_password].collect{|p| update_params.delete(p) }
    end

    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    if update_resource(resource, update_params)
      yield resource if block_given?
      if is_flashing_format?
        flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ?
          :update_needs_confirmation : :updated
        set_flash_message :notice, flash_key
      end
      sign_in resource_name, resource, bypass: true
      respond_with resource, location: after_update_path_for(resource)
    else
      clean_up_passwords resource
      respond_with resource
    end
  end

  protected

  def update_resource(resource, params)
    resource.update_attributes(params)
  end
end

Hope this helps somebody!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM