我无法在使用Rails进行敏捷Web开发的第15章-操场问题1中弄清楚什么。 它要求修改用户更新功能以要求并验证当前 密码,然后才能更改用户密码。
我真的不明白如何获取 has_secure_password 帮助方法,以允许我也查找当前密码(如果有),并在允许更改之前查看它是否等于哈希值。密码。
我正在与书一起阅读,当它进入这些游乐场时,我感觉好像在嚼很多玻璃。
我的_form部分看起来像这样:
<h2>Enter User Details</h2>
<div class="field">
<%= form.label :name, 'Name:' %>
<%= form.text_field :name, id: :user_name, size: 40 %>
</div>
<% if user.password_digest %>
<%= form.label :password_digest, 'Current Password' %>
<%= form.password_field :password_digest, id: :password_digest, size: 40 %>
<% end %>
<div class="field">
<%= form.label :password, 'Password' %>
<%= form.password_field :password, id: :user_password, size: 40 %>
</div>
<div class="field">
<%= form.label :password_confirmation, 'Confirm:' %>
<%= form.password_field :password_confirmation,
id: :user_password_confirmation,
size: 40 %>
</div>
<div class="actions">
<%= form.submit %>
</div>
我检查当前用户在实例变量中是否具有password_digest属性,以查看是否显示全部用password_digest符号修饰的表单块。
在我的user_controller的 update 函数中,看起来像这样
def update
puts "update running"
puts @user
puts @user.name
puts @user.password
puts @user.password_confirmation
respond_to do |format|
if @user.update(update_params)
# format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.html { redirect_to users_url, notice: "User #{@user.name} was successfully updated." }
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
您会注意到'update_params'的使用...我在文件底部制作了另一个私有方法,该方法不同于标准的'user_params',我想通过将其替换为混合我可以得到整个东西工作。
说实话,我是如此难以置信。如果有人可以指导我如何做,我将非常感激。我已经在Google上搜索了所有信息,然后对stackflow进行了全面搜索,感觉就像是在寻找可以扑灭水的水一样,我只能找到易燃液体,每种液体对热的反应性都比上一种高。
那里是否有一个完成所有这些额外“操场”工作的存储库,所以我可以看看它们,看看发生了什么事情?
答案 0 :(得分:0)
从您的表单中删除:password_digest
,它没有任何作用(如果您自动填充它,那么它就达不到目的,如果您不这样做,则用户不能输入它,因为他们没有不知道值)。
为当前密码添加常规密码输入,用户将填写该密码。
<%= password_field_tag :current_password %>
允许:password
中的:password_confirmation
和update_params
,如果还没有的话。
在您的控制器中,使用has_secure_password的authenticate
方法添加对当前密码的检查。
if user.authenticate(params[:current_password])
# user provided valid current password, proceed with saving
我真的不明白如何获取has_secure_password帮助方法,让我也可以查找当前密码(如果有),并在允许更改密码之前查看它是否等于哈希。
您无法从数据库中检索用户的密码。因此,您要做的是询问用户他们认为当前密码是什么,对他们的输入进行哈希处理,然后与存储的密码哈希进行比较(authenticate
完成最后两个步骤)。