邮件程序无法访问用户模型中的reset_token [英] Mailer unable to access reset_token in User model

查看:99
本文介绍了邮件程序无法访问用户模型中的reset_token的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

faced with an issue where @user.reset_token returns nil.

app / views / user_mailer / password_reset.html.erb

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时会发生此问题。请参阅下面的代码。

Reset_token is declared in User model, whereby this problem happens when I try to use a sidekiq worker. Refer to code below.

app / models / user.rb

app/models/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 

app / workers / password_reset_worker.rb

app/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

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

不会发生此问题当我不使用工人时

This problem DOES NOT happen when I do not use workers

app / models / user.rb

app/models/user.rb

  def send_password_reset_email
    UserMailer.password_reset(self).deliver
  end

想知道我可以用 @ user.reset_token代替什么吗?让我知道您是否需要更多信息。

Would like to know what can I replace "@user.reset_token" with? Let me know if you need more info. Thanks in advance.

推荐答案

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

You're not storing the reset_token in the database - you're storing the reset_digest.

当您不使用工作程序时,您将在存储用户实例中的 reset_token ,然后将该同一个用户实例传递给邮件程序-因此 reset_token 仍然可用。

When you don't use workers, you're storing the reset_token in the User instance, then passing that same User instance to your mailer - hence the reset_token is still available.

使用工作程序时,工作程序只有用户的ID,因此它正在从数据库中重新加载用户实例。因为 reset_token 没有存储在数据库中,所以它返回nil。

When you use workers, your worker only has the User's ID, so it's reloading the User instance from the database. Because the reset_token isn't being stored in the database, it's coming back nil.

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

Either you should be saving the reset_token in the database, or your password email should be using reset_digest in the URL.

这篇关于邮件程序无法访问用户模型中的reset_token的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆