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

sec · 2017年07月02日 · 最后由 sec 回复于 2017年07月03日 · 1513 次阅读

请教各种大牛,当调用 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

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

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

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

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

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

#路由 
resources :password_resets

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

Lancelot 回复

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

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

@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) %>
sec 关闭了讨论。 07月03日 15:59
需要 登录 后方可回复, 如果你还没有账号请 注册新账号