闲得没事搜了一下,还真有人实现了一次。。NB
总算轮到成都了,一定要去。
果然没有什么是上一次厕所不能解决的,如果不行,那就两次。
我已经从 windows 逃跑了。
@laoyuan 木工赞!
#3 楼 @rei activation_token 的设置在 models/user.rb 里面,使用 before_create 调用的 create_reset_digest 方法设置值。 我再理一下过程,上面看起来还是有点乱。 1.注册账号的时候进入 controllers/users_controller.rb 的 create 方法。 2.create 方法通过实例化对象 @user 获取 User.new(form_params),这个时候 acvication_token 是有值的。 3.@user 保存成功后使用 models/user.rb 也就是自身的一个方法 send_activation_email 发送邮件。 4.send_activation_email 中使用 UserMailer.account_activation(self).deliver_later 发送邮件。 5.被调用的 UserMailer(mailers/user_mailer.rb ) 会将传递过来的对象赋值给一个新的实例对象 @user 以供在邮件模板 /views/user_mailer/account_activation.html.erb 中使用。 6.邮件模板中使用了具名路由生成链接 edit_account_activation_url(@user.activation_token,email: @user.email),但是 @user.activation_token 值是 nil,然后报错。
在第 3 步的时候还有值,打到这里我突然想起 deliver_later 使用了 ActiveJob 我应该去看一下日志。。然后发现一件事情,deliver_now 是直接把 整个对象传递过去的,而使用 deliver_later 的时候是新建了一个 user 到数据库去取的值,问题应该是在这里了,请问应该怎么解决呢。 调试的图片我去编辑原文补上。