在教程(第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
答案 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) - ,没有“:”,所以对于任何偶然发现的人来说,在代码中查找拼写错误,因为代码有效... 它花了我几个小时,但它现在就像一个魅力:)