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

时间:2015-05-07 15:12:34

标签: ruby-on-rails devise

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

Allow users to edit their password

Allow users to edit their account without providing a password

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

因此我尝试在注册控制器而不是应用程序中执行 solution 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

这样,只有添加了 name 等属性才会在密码被完全过滤后更新。 我不确定我是否应该像解决方案2和3 那样开始大量定制,以实现这样一个简单的目标。我错过了什么吗?

2 个答案:

答案 0 :(得分:9)

将此添加到您的registrations_controller:

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

覆盖用户模型或使用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

答案 1 :(得分:3)

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

所以(可能有风险的)解决方案是在我的资源模型中覆盖 update_without_password ,但不删除密码* params