让用户在没有设置当前密码的情况下更新他们的密码

mas*_*ugo 5 ruby-on-rails devise

我在轨道4.2.1和设计3.4.1.我基本上想要同时做两件事:

允许用户编辑其密码

允许用户在不提供密码的情况下编辑其帐户

我设法让他们分开工作.但是第一个问题的解决方案1似乎是,我担心,与第二个问题的唯一官方解决方案不兼容,因为对于后者,我需要覆盖注册控制器.

因此,我尝试在注册控制器而不是应用程序中执行解决方案1作业:

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_account_update_params, only: [:update]

  protected

  def configure_account_update_params
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:name, :password, :password_confirmation, :current_password) }
  end

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

end
Run Code Online (Sandbox Code Playgroud)

这种方式只有在密码被完全过滤掉时才添加名称等属性.对于这样一个简单的目标,我不确定我是否应该像解决方案2和3那样开始大量定制..我错过了什么?

use*_*468 9

将此添加到registrations_controller:

def update_resource(resource, params)
    resource.update_without_password(params)
end
Run Code Online (Sandbox Code Playgroud)

并覆盖用户模型或使用Devise的模型的update_withour_password方法:

   def update_without_password(params, *options)

    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = update_attributes(params, *options)
    clean_up_passwords
    result
  end
Run Code Online (Sandbox Code Playgroud)


mas*_*ugo 5

在深入研究设计代码后,我发现update_without_password故意删除了:password参数:password_confirmation。出于安全原因,默认情况下会这样做。

因此(可能有风险)的解决方案是按原样覆盖我的资源模型中的update_without_password但不删除密码*参数