Rails Sidekiq 发送邮件始终出现错误

sec · 发布于 2017年07月02日 · 最后由 sec 回复于 2017年07月03日 · 353 次阅读
27349

请教各种大牛,当调用send_password_reset_email时,sidekiq始终出现错误。

class User < ApplicationRecord
  # 发送重置密码邮件
  def send_password_reset_email
    EmailWorkerJob.perform_later(self)
  end
end

#Job
class EmailWorkerJob < ApplicationJob
  queue_as :default

  def perform(user)
    UserMailer.password_reset(user).deliver_now
  end
end

#Mailer
class UserMailer < ApplicationMailer
  def password_reset(user)
    @user = user
    mail to: @user.email, subject: "密码重置"
  end
end
共收到 8 条回复
28931

哥你这个明显是View的视图错了,debug下视图的代码吧

7072

view 里面调用了 edit 那个路由,我猜是没声明找回密码的路由,试试这个 https://stackoverflow.com/a/7403353/2477886

如果还是不行,试试重启下 sidekiq 。

27349

@ForrestDouble @yfractal 谢谢。 目前直接同步发送都正常,但是异步在后台sidekiq执行发送和View没有什么关系吧。只是让sidekiq悄悄的发送邮件,也不需要跳转界面。

class User < ApplicationRecord
  # 发送重置密码邮件正常
  def send_password_reset_email
    UserMailer.password_reset(self).deliver_now
  end
end

#路由 
resources :password_resets
A1b821

亲,报错写的很清楚啊...edit,少了id

27349
A1b821Lancelot 回复

缺少ID的话,为什么同步发送都正常,异步却不行? 正常的跳转url也是没有ID的: http://localhost:3000/password_resets/QLFbY9AF9fAKniiU0YQLWQ/edit?email=hwec%40gmail.com

A1b821

https://ruby-china.org/topics/26115看看这篇能不能帮到你

737f5d

sidekiq wiki里写得很清楚,不要传入self这种会动态发生改变的参数。在password_reset(self)这个job里面把self参数改为具体的参数,例如id, name, email这样,要明确和确实地把值传给job.

https://github.com/mperham/sidekiq/wiki/Best-Practices#1-make-your-job-parameters-small-and-simple

27349

@leiz_me @Lancelot 谢谢,问题已解决。

#主要是rails中声明的虚拟字段 reset_token,sidekiq无法读取
class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token, :reset_token
end

#然后报错 ID为nil, 由于@user.reset_token=nil不存在,然后缺少url参数sidekiq报错,将@user.reset_token修改。
<h1>重置密码</h1>

<%= link_to "重置密码", edit_password_reset_url(@user.reset_token, email: @user.email) %>
27349 sec 关闭了讨论 07月03日 15:59
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册