Update_attribute无法在生产中使用

问题描述 投票:0回答:1

这是最奇怪的事情,但我正在构建我的应用程序中的密码重置功能,并且遇到了一个不会加起来的问题。下面是被调用的控制器操作和类方法:

用于创建密码重置链接的控制器操作:

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 && [email protected]_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 && [email protected]_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"=>"[email protected]", "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", "[email protected]"]]
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中完全正常工作(使用几乎相同的方法)。

ruby-on-rails heroku production-environment password-recovery
1个回答
0
投票

update_attribute仅在所有验证通过时更新记录。检查user.errors

为了绕过验证使用:

user.update_column(:reset_sent_at, Time.zone.now)
© www.soinside.com 2019 - 2024. All rights reserved.