这是最奇怪的事情,但我正在构建我的应用程序中的密码重置功能,并且遇到了一个不会加起来的问题。下面是被调用的控制器操作和类方法:
用于创建密码重置链接的控制器操作:
class PasswordResetsController < ApplicationController
before_action :get_user, only: [:edit, :update]
before_action :valid_user, only: [:edit, :update]
before_action :check_expiration, only: [:edit, :update]
def create
@user = User.find_by(email: params[:password_reset][:email].downcase)
if @user && !@user.activated_at.nil?
**@user.create_password_reset_digest**
@user.send_password_reset_email
flash[:info] = "message."
redirect_to root_url
else
flash[:danger] = "different message"
redirect_to root_url
end
end
def edit
end
private
## Before Filters ##
def get_user
@user = User.find_by(email: params[:email])
end
# Confirms a valid user
def valid_user
# Unless executes code if conditinal is flase
unless (@user && !@user.activated_at.nil? && @user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
end
在dev中工作的用户方法,但不是prod
def create_password_reset_digest
self.reset_token = User.new_token
**update_attribute(:reset_digest, User.digest(reset_token))**
**update_attribute(:reset_sent_at, Time.zone.now)**
end
如上所述,一切都适用于dev,当我点击prod中的有效电子邮件链接时,我被重定向到主屏幕,我查看了heroku日志,其中说明我的before_action失败:
2016-08-26T19:36:00.208550+00:00 app[web.1]: Started GET "/password_resets/8quvjXgdAKF7fLlWmna0Yg/edit?email=themobio025%40gmail.com" for 98.248.238.131 at 2016-08-26 19:36:00 +0000
2016-08-26T19:36:00.211708+00:00 app[web.1]: Processing by PasswordResetsController#edit as HTML
2016-08-26T19:36:00.211766+00:00 app[web.1]: Parameters: {"email"=>"themobio025@gmail.com", "id"=>"8quvjXgdAKF7fLlWmna0Yg"}
2016-08-26T19:36:00.214843+00:00 app[web.1]: User Load (1.9ms) SELECT "users".* FROM "users" WHERE "users"."email" = $1 LIMIT 1 [["email", "themobio025@gmail.com"]]
2016-08-26T19:36:00.218126+00:00 app[web.1]: Redirected to http://qa-themob.herokuapp.com/
2016-08-26T19:36:00.218197+00:00 app[web.1]: Filter chain halted as :valid_user rendered or redirected
行动前:
def valid_user
unless (@user && @user.authenticated?(:reset, params[:id]))
redirect_to root_url
end
end
然后我尝试深入挖掘并查看发生了什么,然后我打开了一个heroku控制台会话并完成了重置过程。我发现在提交密码重置电子邮件时,正在生成链接,但密码重置摘要ID未保存给用户(通过上面的粗体更新属性)。我不知道为什么这个没有被保存到数据库,再次它在dev中完全正常工作,我的激活电子邮件工作流程在prod和dev中完全正常工作(使用几乎相同的方法)。
答案 0 :(得分:0)
update_attribute
才会更新记录。检查user.errors
为了绕过验证使用:
user.update_column(:reset_sent_at, Time.zone.now)