12

我已经用我的设计模型实现了omniauth,所以我可以使用其他服务进行身份验证。我的模型不再需要密码,因为用户可以使用 twitter、facebook 进行身份验证......

一切正常,但是,当用户尝试编辑其注册时,设计跳过该过程,因为用户没有通知“current_password”(现在在某些情况下不存在)。

我创建了一个注册控制器来覆盖设计:

class RegistrationsController < Devise::RegistrationsController
  def update
    super
  end
end

但是我没有找到任何关于如何跳过密码验证的文档,我怎么能在我的更新操作中做到这一点?

4

5 回答 5

35

与上面类似,尝试将其放入您的用户模型中:

# bypasses Devise's requirement to re-enter current password to edit
def update_with_password(params={}) 
  if params[:password].blank? 
    params.delete(:password) 
    params.delete(:password_confirmation) if params[:password_confirmation].blank? 
  end 
  update_attributes(params) 
end
于 2011-02-21T20:25:10.640 回答
10

以下对我有用:

在我的用户控制器中,在更新操作中,我有

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

也许您可以将其调整为before_save回调?

于 2010-11-26T01:31:27.833 回答
1

即使答案已经在这里有一段时间了,我想发布一个新的,因为我认为所选答案有一些缺陷。也许在创建答案的那一刻它没有,但现在在 中2013,答案将是这样的:

User解决方案是在这样的模型中创建:

  # bypass re-entering current password for edit
  def update_with_password(params={}) 
    current_password = params.delete(:current_password)

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

    clean_up_passwords
  end
于 2013-04-21T10:22:27.790 回答
1

有一个更简单的答案,我不知道设计何时首次使用此方法,但只需添加

Model.update_without_password(params)

它将更新属性而不需要当前密码。

于 2016-07-14T14:18:18.823 回答
0

从设计v4.6.2 开始。这很容易做到。

正如文档所说的here:

默认情况下,我们希望在更新时要求密码检查。您可以在自己的 RegistrationsController 中覆盖此方法。

这意味着,在您的控制器中覆盖替换为update_resourceupdate_with_password方法update_without_password

class Users::RegistrationsController < Devise::RegistrationsController

  # ...

  protected

  def update_resource(resource, params)
    resource.update_without_password(params)
  end
end
于 2019-05-14T14:13:56.123 回答