我正在尝试创建一个允许用户更改密码的表单,但要求他们先输入旧密码。我按照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中 - 可能是用户无法访问使用密码更新的设计方法吗?有办法解决这个问题吗?
答案 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