设计:允许用户在不提供密码的情况下编辑他们的帐户,但也使用“可重新配置”功能

时间:2014-07-01 14:32:28

标签: ruby-on-rails devise ruby-on-rails-3.2 devise-confirmable

我一直在Devise wiki中关注这个方法......

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

...让我的用户可以更改帐户凭据并在不提供现有密码的情况下进行更新。

但是,我还想使用Confirmable模块reconfirmable功能

即使我在设计初始化程序文件中设置了config.reconfirmable = true,控制器也似乎无法发送可重新启动的电子邮件。

任何想法有什么不对?

1 个答案:

答案 0 :(得分:3)

问题在于原始操作方法中的控制器具有可确认模块所需的各种缺失的设计方法。

为了让它发挥作用,我必须尽可能多地使用update中的原始Devise::RegistrationsController操作,并覆盖update_resource(resource, params)操作,以便它不会需要密码来更新记录。

所以我的定制RegistrationsController现在看起来像这样:

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

希望这有助于某人!