设置更改密码并确认当前密码

时间:2016-01-14 23:15:52

标签: ruby-on-rails ruby-on-rails-4 devise

我正在尝试创建一个允许用户更改密码的表单,但要求他们先输入旧密码。我按照wiki进行了设计,https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-password并有以下形式:

foo
  

以下是我的用户控制器中的更新调用:

<%= f.fields_for :user_account, @user.user_account do |user_account| %> 
<p>Edit password for account: <%=  @user.user_account.email %></p> 
<div class="field">
  <%= user_account.label :current_password %> <i>(we need your current password to confirm your changes)</i><br />
  <%= user_account.password_field :current_password %>
</div>
<div class="field">
  <%= user_account.label :password %>
  <% if @minimum_password_length %>
  <em>(<%= @minimum_password_length %> characters minimum)</em>
  <% end %><br />
  <%= user_account.password_field :password, autocomplete: "off" %>
</div>

<div class="field">
  <%= user_account.label :password_confirmation %><br />
  <%= user_account.password_field :password_confirmation, autocomplete: "off" %>
</div>

<div class="actions">
  <%= user_account.submit "Edit" %>
</div>

但是,我得到一个未定义的方法`update_with_password'用于用户错误。 devise被添加到模型user_account中 - 可能是用户无法访问使用密码更新的设计方法吗?有办法解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您可以更改为:

def update
  respond_to do |format|
    if @user.update(user_params)
      sign_in @user, :bypass => true
      format.html { redirect_to user_path(@user) }
      format.json { render :show, status: :ok, location: @user }
    else
      format.html { render :edit }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

它将验证您的旧密码。我希望这项工作。

答案 1 :(得分:-1)

首先,获取用户的current_user.id,然后在Devise gem中,您可以使用update_with_password方法询问当前密码并使用强参数。

它在轨道4和5上工作。

def update
    @user = User.find(current_user.id)
    respond_to do |format|
      if @user.update_with_password(password_params)
        sign_in @user, :bypass => true
        format.html { redirect_to user_path(@user) }
        format.json { render :show, status: :ok, location: @user }
      else
        format.html { render :edit }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
end

private
def password_params
    params.require(:user).permit(:password, :password_confirmation, :current_password)
end