【问题标题】:ActionMailer -- NoMethodError: undefined method X for MyMailer:ClassActionMailer -- NoMethodError: MyMailer:Class 的未定义方法 X
【发布时间】:2016-02-08 22:57:51
【问题描述】:

问题:如果方法就在那里,为什么它是未定义的?

详情:

我有一个非常简单的邮件类:

class ProductMailer < ApplicationMailer
  def sample_email
    mail(to: "me@example.com") # I hardcode my own email just to test
  end
end

还有一个来自 ProductsController 的非常简单的调用:

def sample_email
  ProductMailer.sample_email().deliver_later
  redirect_to @product, notice: 'Email was queued.'
end

邮件发送失败。我正在使用 Sidekiq 在后台处理电子邮件。 Sidekiq Web UI 在 Tries 页面中显示失败的作业,我可以看到失败的原因:

NoMethodError: undefined method `sample_email' for ProductMailer:Class

我尝试重命名该方法并使用rails server 重新启动服务器,但这些都不能消除错误。我没有使用任何命名空间。

问题:如果方法就在那里,为什么它是未定义的?

注意:我偶然发现如果我将它命名为notify,方法找到的,但也许那是因为我正在覆盖 ActionMailer 基类中的一些方法,我不知道。

【问题讨论】:

  • ApplicationMailer 是否继承自 ActionMailer::Base?
  • 是的,ApplicationMailer 继承自 ActionMailler::Base。我使用rails generate mailer 生成了邮件。

标签: ruby-on-rails email actionmailer sidekiq nomethoderror


【解决方案1】:

答案:重启 Sidekiq

我在启动 Sidekiq 之前创建了邮件程序类,但我在 Sidekiq 已经运行时重命名了 sample_email 方法,因此 Sidekiq 似乎无法即时识别新方法。

我重命名了该方法,因为我习惯了开发环境,您几乎可以在其中动态更改任何内容...

【讨论】:

    【解决方案2】:

    这是因为你定义了一个实例方法,然后你尝试在一个类上调用它。改成

    def self.sample_email
        ....
    

    【讨论】:

    • 这确实是错误的。 Mailer 类不应使用self 声明方法
    猜你喜欢
    • 2013-04-24
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2019-06-12
    • 2013-11-14
    相关资源
    最近更新 更多