邮件程序无法访问用户模型中的 reset_token [英] Mailer unable to access reset_token in User model
问题描述
面临@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 是在 User 模型中声明的,当我尝试使用 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
.
当您不使用 worker 时,您将 reset_token
存储在 User 实例中,然后将相同的 User 实例传递给您的邮件程序 - 因此 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屋!