我们最近将代码库从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
1条答案
按热度按时间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版本,然后开始进一步升级您的Rails应用程序,直到您可以再次升级Ruby版本。