我刚刚将我的应用程序从Rails 4.0升级到了4.2.6,并将我们的Ruby版本升级到了2.3.7。
在测试我的应用程序时,我注意到重置密码电子邮件未发送出去。看看。
password_resets_controller.rb
def create
@user = User.find_by_email(params[:email])
if @user
@user.deliver_password_reset_instructions!
end
flash[:notice] = "Instructions to reset your password have been emailed to you"
render :action => :new
end
此deliver_password_reset_instructions!
存在于我的用户模型文件中。
user.rb (一年多来没有更改)
def deliver_password_reset_instructions!
reset_perishable_token! #this method updates the user's perishable_token
NotificationMailer.send_reset_instructions(self)
end
但是...当我在NotificationMailer模型中调用send_reset_instructions
方法时,什么也没有发生。但是...当我在代码中放入调试器时,例如:
def deliver_password_reset_instructions!
reset_perishable_token! #this method updates the user's perishable_token
binding.pry # If I call `NotificationMailer.send_reset_instructions(self)` it works
NotificationMailer.send_reset_instructions(self)
end
然后我运行NotificationMailer.send_reset_instructions(self)
,它可以工作,但要我不键入它就不能。
对于我来说,realyl似乎很奇怪……它可以工作……但是只有当我在调试器中手动键入它时。所以,我不能把手指放在哪里坏了。
答案 0 :(得分:2)
ActionMailer在Rails 4.2中进行了更改,引用了upgrade guide:
以前,在mailer类上调用mailer方法将导致直接执行相应的实例方法。随着Active Job和
#deliver_later
的引入,情况不再如此。在Rails 4.2中,实例方法的调用推迟到调用deliver_now
或deliver_later
之前。
因此,在您的情况下,只需将.deliver_now
附加到您的通话中就可以了:
NotificationMailer.send_reset_instructions(self).deliver_now