Ruby on Rails更新触发了Mailer函数中的ArgumentError

scyqe7ek  于 2023-05-17  发布在  Ruby
关注(0)|答案(1)|浏览(98)

我们最近将代码库从Ruby 2.7.x和Rails 5.2.x迁移到Ruby 3.2.2和Rails 6.1.7.3。以前,我们的邮件是这样定义的:

class ApplicationMailer < ActionMailer::Base
...
end
class MyMailer < ApplicationMailer  
  def custom(user: , timestamp: Time.now)
    @user = user
    @timestamp = timestamp
  end
end

我们会发送这样的电子邮件:MyMailer.custom(user: @myuser).deliver_now。更新后,现在返回ArgumentError: wrong number of arguments (given 1, expected 0; required keyword: user) (ArgumentError)
我们发现我们应该在params散列中传递参数并从那里读取,但与我们以前的解决方案相比,这似乎非常繁琐和不优雅。所以我的问题是

  • Ruby(或Rails)的哪个代码更改导致了我们之前的解决方案失败?
  • 是否有一种方法,我们仍然可以定义Mailer方法与自定义关键字参数?

这是我们显然应该传递参数的方式:

class MyMailer < ApplicationMailer  
  def custom
    @user = params[:user]
    @timestamp = params[:timestamp] || Time.now
  end
end
cbwuti44

cbwuti441#

ActionMailer仍然接受邮件程序操作的传递参数。然而,看起来Ruby 3.2中的关键字参数语义并不是Rails 6.1所期望的,这导致了你所看到的问题。
Rails 6.1在Ruby 3.2之前发布。由于最近的Ruby版本改变了一些关键字参数的语义,Rails 6.1似乎不(完全)兼容Ruby 3.2。
虽然我还没有找到任何关于这方面的权威文档,但对于Rails www.example.com标记上的最新提交6.1.7.3,actionmailer测试在Ruby 3.2中关于关键字参数的测试中失败了。
因此,您有两种可能的方法来解决此问题:

  • 您可以使用Ruby 6.1应用程序恢复到Ruby 3.1
  • 或者您可以进一步升级您的Rails版本到> 7.0.1

作为一个快速解决方案,您现在可能首先降级您的Ruby版本,然后开始进一步升级您的Rails应用程序,直到您可以再次升级Ruby版本。

相关问题