使用Rails 5.1 Playground进行敏捷Web开发-Ch 15密码故障

时间:2018-11-30 08:07:18

标签: ruby-on-rails

我无法在使用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进行了全面搜索,感觉就像是在寻找可以扑灭水的水一样,我只能找到易燃液体,每种液体对热的反应性都比上一种高。

那里是否有一个完成所有这些额外“操场”工作的存储库,所以我可以看看它们,看看发生了什么事情?

1 个答案:

答案 0 :(得分:0)

  1. 从您的表单中删除:password_digest,它没有任何作用(如果您自动填充它,那么它就达不到目的,如果您不这样做,则用户不能输入它,因为他们没有不知道值)。

  2. 为当前密码添加常规密码输入,用户将填写该密码。

    <%= password_field_tag :current_password %>
    
  3. 允许:password中的:password_confirmationupdate_params,如果还没有的话。

  4. 在您的控制器中,使用has_secure_password的authenticate方法添加对当前密码的检查。

    if user.authenticate(params[:current_password]) 
      # user provided valid current password, proceed with saving
    

  

我真的不明白如何获取has_secure_password帮助方法,让我也可以查找当前密码(如果有),并在允许更改密码之前查看它是否等于哈希。

您无法从数据库中检索用户的密码。因此,您要做的是询问用户他们认为当前密码是什么,对他们的输入进行哈希处理,然后与存储的密码哈希进行比较(authenticate完成最后两个步骤)。