升级Rails&Ruby版本后,ActionMailer无法正常工作。仅适用于终端

时间:2018-08-14 21:16:00

标签: ruby-on-rails ruby

我刚刚将我的应用程序从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似乎很奇怪……它可以工作……但是只有当我在调试器中手动键入它时。所以,我不能把手指放在哪里坏了。

1 个答案:

答案 0 :(得分:2)

ActionMailer在Rails 4.2中进行了更改,引用了upgrade guide

  

以前,在mailer类上调用mailer方法将导致直接执行相应的实例方法。随着Active Job和#deliver_later的引入,情况不再如此。在Rails 4.2中,实例方法的调用推迟到调用deliver_nowdeliver_later之前。

因此,在您的情况下,只需将.deliver_now附加到您的通话中就可以了:

NotificationMailer.send_reset_instructions(self).deliver_now