Mailer无法访问用户模型中的reset_token

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

应用程序/视图/ user_mailer文件/ password_reset.html.erb

 

Reset_token在User模型中声明,当我尝试使用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 

应用程序/工人/ 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 

应用程序/邮寄者/ 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 

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

应用程序/模型/ 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没有存储在数据库中,所以它回来了。

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