【问题标题】:Rails 5.1 mailer wrong number of arguments given 0 expected 2Rails 5.1 邮件程序错误的参数数量给定 0 预期 2
【发布时间】:2017-08-02 23:18:55
【问题描述】:

我正在使用 Ruby 2.4.1 开发 Rails 5.1.2 应用程序。我正在创建一个简单的邮件以在课堂上使用,如下所示:

  class PagingMailer < ApplicationMailer
      include SendGrid
      default from: Rails.application.secrets.no_reply_email

      def message(paging_id, email)
        @paging = Paging.find(paging_id)
        mail to: email, subject: "#{@paging.user.username} has sent you a message"
      end
    end

PagingMailer 类中的message 方法接受paging_id(整数)的参数,并传递电子邮件地址的第二个参数(字符串)。最初我用一个 sidekiq 工作人员解雇了这个,它不会提供错误数量的参数给定 0 预期 2 异常。

所以我启动了一个 Rails 控制台并尝试做一个简单的测试,让 sidekiq 离开以防万一。

Loading development environment (Rails 5.1.2)
irb(main):001:0> PagingMailer.message(33, "john@domain.com").deliver
PagingMailer#message: processed outbound mail in 69.1ms
ArgumentError: wrong number of arguments (given 0, expected 2)
    from app/mailers/paging_mailer.rb:5:in `message'
    from app/mailers/paging_mailer.rb:7:in `message'
    from (irb):1

stacktrace 指向 message 方法中的第 5 行和第 7 行,这里的常见主题是 email 参数。

作为测试,我尝试删除第二个参数并将“john@domain.com”硬编码到 mail to: 部分,因此该方法只需要paging_id 的单个参数。当我从 Rails 控制台触发它时,我得到以下信息:

irb(main):003:0> PagingMailer.message(33).deliver
PagingMailer#message: processed outbound mail in 27.4ms
ArgumentError: wrong number of arguments (given 0, expected 1)
    from app/mailers/paging_mailer.rb:5:in `message'
    from app/mailers/paging_mailer.rb:7:in `message'

我实际上是在将一个参数传递给该方法,但它没有看到它,即使它是作为一个对象传递的。

应该注意的是,我的应用程序中还有其他一些邮件程序,它们的配置类似,可以接受 2 个参数,并且它们可以正常运行。但是我很难处理这个特定的邮件。

不确定我是否遗漏了一些非常明显的东西,或者这可能是某种 Rails 错误。

非常感谢您提供的任何帮助。

【问题讨论】:

  • 我认为您的问题与 SendGrid 设置有关。删除“包含 SendGrid”并测试是否有效。
  • @PapayaLabs 不,这不是问题所在。我的其他邮件程序类使用相同的包含声明性并且工作得很好。我应您的要求删除了它,它产生了相同的异常。
  • 所以可能在#{@paging.user.username} 中。我不知道您的分页模型如何。我没有看到任何其他问题。
  • 尝试删除所有@paging 对象,看看是否有效
  • @PapayaLabs 也不是这样,因为该实例变量是合法的,并且在传递参数后通过 AR 查找。引发的异常甚至与 AR 查找无关。这是 ActionMailer 类,动作方法在传递参数时不接受参数。请参阅原始问题。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 actionmailer


【解决方案1】:

更改方法“消息”的名称。 ActionMailer::Base 定义了一个名为 'message' 的 attr_internal,因此创建了读写实例方法,并且您将覆盖它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多