Michael Hartl的Rails教程:图12.11:密码重置表单

时间:2016-08-03 21:46:51

标签: ruby-on-rails railstutorial.org

在教程(第4版,对于Rails 5)中,我来到第12章。 如果忘记密码,可以重置密码。我检查并仔细检查了我的代码,并将它与Michael的Bitbucket中的文件进行了比较: https://bitbucket.org/railstutorial/sample_app_4th_ed/src/6c255b27f7c7935dd9b04f28d3a249af8618242f/?at=password-reset

会发生什么?密码重置后发送电子邮件(没有问题,afaik),文字说"按照清单12.11中的链接应该呈现密码重置表单。结果如图12.11所示。"

然而,重置表格没有出现;相反,我立即被重定向到根,没有消息或错误。

我之前发现了类似的问题,但无法弄清楚解决方案是什么;在哪里寻找错误?

我仍然可以被认为是一个新手,不幸的是,我没有真正的线索如何解决这个....

感谢您的帮助,广告

答案很有帮助,然而,对我来说还不是很有帮助;我将编辑更多信息:(在$ rails console中)我输入了:

>> User.find_by(email: "example@railstutorial.org") User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = ? LIMIT ? [["email", "example@railstutorial.org"], ["LIMIT", 1]] => #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2016-07-28 22:52:07", updated_at: "2016-08-03 16:51:52", password_digest: "$2a$10$IFxi0SPvA/I4rY53g.PrF.Ihxgb9.KtZpC2jcjWLgqk...", remember_digest: nil, admin: true, activation_digest: "$2a$10$J49AUluY8tSVExQBeDeCoO3U8bCHgNEgNjMyVtFmzT6...", activated: true, activated_at: "2016-07-28 22:52:06", reset_digest: "$2a$10$GGExFYbJIqhqSZq.Nc7hUeJhnbTRmtPjsAd89K99X8L...", reset_sent_at: "2016-08-03 16:51:52">

你看到这个&#34;示例用户&#34;被激活,并发送重置。 问题&#39; (或挑战)因此在于经过身份验证的?(属性,令牌)方法;这不是很明显吗?

我如何看待内部运作&#39;这种方法?对我来说,作为一个新手,我很想知道如何做到这一点。

pry对我来说是新的;哈特尔的教程直到现在都没有提到这一点。我见过的唯一可能的选择是debugger。可以用吗?

关于:reset的另一个问题究竟是什么?一个符号?但代表什么是符号?它是指一个方法,一个变量,内置?

我在想,也许更多的调试信息可以放在屏幕上?例如,在app/views/layouts/application.html.erb中,如果有这一行:

<%= debug(params) if Rails.env.development? %>

可以加强吗?

更新:当我在最后一行注释掉时,我发现图12.11中的屏幕显示出来了:redirect_to root_url

3 个答案:

答案 0 :(得分:1)

在app / controllers / passwords_resets_controller.rb中,注意到编辑操作有几个before_action次调用。其中一个是......

  before_action :valid_user,       only: [:edit, :update]

   def valid_user
      unless (@user && @user.activated? &&
              @user.authenticated?(:reset, params[:id]))
        redirect_to root_url
      end
    end

redirect_to root_url正是您遇到的问题,因此必须是(a)找不到@user,或(b)@user.activated?不正确或(c)@user.authenticated?(:reset, params[:id])不正确。

所以要解决这个问题,你需要找出哪些条件失败然后找出原因。您可以使用pry执行此操作(我不知道Hartl教程是否涵盖pry),或者您可能需要设置一些Rails.logger.info行来检查变量。

答案 1 :(得分:1)

我也遵循了哈特尔的教程(rails 5版本)。在我的情况下,我发现我被重定向到root_url因为我使用的电子邮件是针对尚未激活的用户(制作@user.activated? == false

我想,这种意外行为的发生是因为有时我们使用数据库中的数据进行测试,我们在开发模式中将自己置于种子中,我们没有注意到我们在生产模式中遗漏了一些帐户经历的流程。

第一个答案对我有用,它提示我使用rails控制台键入每个条件并知道它的值。在我的情况下,@user是真的,但@user.activated?是假的。

我接下来要做的是使用flash消息重构valid_user方法:

def valid_user
    if @user
      if @user.activated?
        unless @user.authenticated?(:reset, params[:id])
          flash[:danger] = "Reset token do not match."
          redirect_to root_url
        end
      else
        flash[:danger] = "User is not yet activated."
        redirect_to root_url
      end
    else
      flash[:danger] = "User does not exist."
      redirect_to root_url
    end
end

现在我知道用户无效了。因此,在将来,如果其他所有情况仍然会在生产模式中发生,我就会知道问题的起源。

在我的情况下,我在不知不觉中首先尝试重置尚未通过激活的用户帐户的密码。如果帐户尚未激活,我想让系统不发送电子邮件,我可能希望先发送电子邮件通知激活通知,以便在更改密码之前先通知用户激活他们的帐户。

但那是另一个生产周期,Rails教程已经遗漏了,因为这是密码重置功能的初始循环,而其他一些辅助方案是供开发人员决定的。

答案 2 :(得分:0)

迟到的回答:),我刚刚到达那个部分并偶然发现同样的问题.. 问题是 - @ user.authenticated?(:reset,params [:id]) - 被评估为false,因为我在user.rb create_reset_digest方法的代码中输入了一个拼写错误。 您更新属性User.digest(:reset_token) - &gt;的部分应该是 - &gt; User.digest(reset_token) - ,没有“:”,所以对于任何偶然发现的人来说,在代码中查找拼写错误,因为代码有效... 它花了我几个小时,但它现在就像一个魅力:)