gpt4 book ai didi

ruby - 邮件程序无法访问用户模型中的 reset_token

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:26 27 4
gpt4 key购买 nike

遇到 @user.reset_token 返回 nil 的问题。

app/views/user_mailer/password_reset.html.erb

<%= link_to "Reset password", edit_password_reset_url(@user.reset_token, email: @user.email) %>

Reset_token 在用户模型中声明,当我尝试使用 sidekiq worker 时会发生此问题。引用下面的代码。

应用程序/模型/user.rb

class User < ActiveRecord::Base

attr_accessor :reset_token

def User.new_token
SecureRandom.urlsafe_base64
end

def send_password_reset_email
PasswordResetWorker.perform_async(self.id)
end

private

def create_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

应用/workers/password_reset_worker.rb

class PasswordResetWorker
include Sidekiq::Worker
sidekiq_options retry: false

def perform(user_id)
user = User.find(user_id)
UserMailer.password_reset(user).deliver
end
end

app/mailers/user_mailer.rb

class UserMailer < ActionMailer::Base
default from: "noreply@example.com"

def password_reset(user)
@user = user
mail to: user.email, subject: "Password Reset"
end
end

当我不使用 worker 时,这个问题不会发生

应用程序/模型/user.rb

  def send_password_reset_email
UserMailer.password_reset(self).deliver
end

想知道我可以用什么替换“@user.reset_token”?如果您需要更多信息,请告诉我。提前致谢。

最佳答案

您没有将 reset_token 存储在数据库中 - 您正在存储 reset_digest

当您不使用 worker 时,您将 reset_token 存储在 User 实例中,然后将相同的 User 实例传递给您的邮件程序 - 因此 reset_token 是仍然可用。

当您使用 worker 时,您的 worker 只有 User 的 ID,因此它会从数据库重新加载 User 实例。因为 reset_token 没有存储在数据库中,所以它返回 nil。

您应该将 reset_token 保存在数据库中,或者您的密码电子邮件应该在 URL 中使用 reset_digest

关于ruby - 邮件程序无法访问用户模型中的 reset_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27883926/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com