【问题标题】:RAILS - Dont understand password reset codeRAILS - 不懂密码重置代码
【发布时间】:2011-01-01 22:00:28
【问题描述】:

我无法理解我在下面的网络上找到的密码重置代码的应用逻辑。

  1. 用户收到一封电子邮件,其中包含 链接一些重置代码。
  2. 点击后,他们转到 下面的操作称为重置
  3. 用户在数据库中被找到 引用重置代码。
  4. 显示更改密码的表格 用户输入新密码 在。

这是我感到困惑的地方。

  1. 提交表单后,再次调用操作。
  2. 这次参数中将没有重置代码,因此不会找到用户@user = nil
  3. 这次是发布请求,因此我们输入了该部分逻辑。

我的问题是 - 如果@user = nil if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])

,这段代码怎么可能有效
# app/controllers/users_controller.rb

def reset
  @user = User.find_by_reset_code(params[:reset_code]) unless params[:reset_code].nil?
  if request.post?
    if @user.update_attributes(:password => params[:user][:password], :password_confirmation => params[:user][:password_confirmation])
      self.current_user = @user
      @user.delete_reset_code
      flash[:notice] = "Password reset successfully for #{@user.email}"
      redirect_to root_url
    else
      render :action => :reset
    end
  end
end

<!-- app/views/users/reset.html.erb -->

<%= error_messages_for :user %>

<% form_for :user do |f| -%>
  <p>
    Pick a new password for <span><%= @user.email %></span>
  </p>

  <p>
    <label for="password">Password</label><br />
    <%= f.password_field :password %>
  </p>

  <p>
    <label for="password">Confirm Password</label><br />
    <%= f.password_field :password_confirmation %>
  </p>

  <p>
    <%= submit_tag 'Reset' %>
  </p>
<% end -%>

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    我的回答是代码有问题。

    首先,reset_code 应该通过表单上的隐藏字段或 URL 中的参数传回控制器。

    其次,如果没有传入 reset_code(如图所示),@user 将为 nil,您将获得一个 AV。您需要在代码周围添加一个保护子句:

    if !@user
      flash.now[:notice] = "User not found."
    elsif request.post?
      ...
    

    此外,如果代码中尚未包含它,您需要某种方式来使重置代码过期。在我的系统上,它们在五天后过期。您需要在您的用户表中添加一个额外的字段。将代码发送的日期存储在其中,并包含另一个在给定时间范围内的保护子句。

    (请记住,仅仅因为您在网上找到它并不意味着它是正确且没有错误的)。

    【讨论】:

      【解决方案2】:

      如果@user = nil,这段代码怎么可能有效

      重置代码,不是您顺便粘贴的视图,它使用相同的 reset_code 查找用户...如果找不到,则 user 为 nil。如果reset code存在,则不会为nil,而是true,而是返回记录。

      【讨论】:

      • 感谢您对错误代码的提醒,我已更正。那么在表单提交回重置操作后会发生什么。 @user 将为零。但那是在 request.post 中使用的?阻止更新用户。我看不出这会如何更新用户?
      【解决方案3】:

      我认为您误解了逻辑流程。您提供的视图用于请求密码重置电子邮件。该电子邮件可能包含重置的 url,其中将包含 reset_code 参数。检查 reset.html 视图以确保在此处处理了 reset_code 参数。

      【讨论】:

      • 抱歉,我添加了错误的视图,但我现在重新编辑了它。提交此表单后,默认情况下应返回重置操作。但是这次参数中没有reset_code,所以我仍然无法弄清楚@user.update_attributes 是如何工作的。
      【解决方案4】:

      提交表单时的操作 再次调用。

      request.post? if 语句检查他们是否正在提交表单。里面的东西只有在表单提交POST请求时才会执行,如果没有,它会像你看到的那样呈现页面。

      这一次参数中将没有重置代码,因此不会找到用户@user = nil

      该页面未呈现,因此不将用户设置为任何内容都可以,它会重定向回主 url,该 url 将基于会话或 cookie,而不是重置代码。

      这次它是一个发布请求,所以我们输入了那部分逻辑。

      虽然我无法弄清楚 @user.update_attributes 是如何工作的,因为就像你说的那样,最后有 unless 声明。

      【讨论】:

      • 没错,它会如何更新?我已经更新了帖子以显示正确的视图以进行重置。不知道有什么变化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-16
      • 2021-08-22
      • 2017-10-13
      • 2023-03-28
      • 1970-01-01
      • 2012-09-23
      • 2011-11-29
      相关资源
      最近更新 更多