6

我正在开发一个使用 Rails 和 Devise 进行用户身份验证的应用程序。我想知道是否有办法只为某些更改询问密码。

例如,我希望在以下情况下询问密码:

  • 删除帐户
  • 更改密码

我希望用户可以在没有任何密码的情况下自由编辑其他字段,例如:

  • 姓名
  • 用户名
  • 阿凡达

所以,我想要一种在这两种方法之间进行交换的方法。我该如何解决这个问题?

编辑:

在 Devise 的文档中,我发现了这一点并且工作正常,如果我输入密码,它只允许更改密码和电子邮件:

def update
    @user = User.find(current_user.id)

    successfully_updated = if needs_password?(@user, params)
        @user.update_with_password(params[:user])
    else
        # remove the virtual current_password attribute update_without_password
        # doesn't know how to ignore it
        params[:user].delete(:current_password)
        @user.update_without_password(params[:user])
    end

    if successfully_updated
        set_flash_message :notice, :updated
         # Sign in the user bypassing validation in case his password changed
         sign_in @user, :bypass => true
         redirect_to after_update_path_for(@user)
    else
         render "edit"
    end

end

private

# check if we need password to update user data
# ie if password or email was changed
# extend this as needed
def needs_password?(user, params)
    user.email != params[:user][:email] ||
    !params[:user][:password].blank?
    #HERE
end

现在,#HERE当我删除帐户时,我还可以输入什么密码?

4

3 回答 3

3

由于问题编辑:

def destroy
  if current_user.valid_password?(params[:user][:password])
    current_user.destroy
  else 
    render "destroy" # or what ever
  end
end
于 2013-04-07T20:19:11.530 回答
0

您可以创建form_tag重定向到控制器中的操作。

<%= form_tag url_for(:controller => :users, :action => :destroy), :method => :get do %>
  <%= label_tag(:password, "Enter password before deleting") %>
  <%= password_field_tag :password %>
  <%= submit_tag "Delete User With Confirmation" %>
<% end %>

您的 UsersController 中的操作类似于:

def destroy
    if current_user.authenticate(params[:password])
         #do something
    else
         #do something
    end
end
于 2013-04-07T20:10:02.130 回答
0

Devise 中有一个destroy_with_password方法(至少从版本 3.5.2 开始)。它在lib/devise/models/database_authenticatable.rb并被调用

destroy_with_password(current_password)

如果 current_password 匹配则销毁记录,否则返回 false。

于 2015-12-21T16:09:29.290 回答