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

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).

我们发现,我们应该在参数散列中传递参数并从那里读取,但与我们之前的解决方案相比,这似乎相当麻烦和不雅致.所以我的问题是,

  • 是什么Ruby(或Rails)代码更改导致我们之前的解决方案失败了?
  • 有没有办法仍然可以用自定义关键字参数定义Mailer方法?

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

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

推荐答案

ActionMailer仍然接受传递邮件程序操作的参数.然而,Ruby 3.2中的关键字参数语义似乎并不完全是rails 6.1所期望的,这导致了您所看到的问题.

在Ruby 3.2出现之前,就已经发布了Rails6.1.由于最近的Ruby版本已经改变了一些带有关键字参数的语义,所以很可能rails 6.1与Ruby 3.2不(完全)兼容.

虽然我还没有找到任何关于这方面的权威文档,但关于Rails 6.1.7.3标记的最新提交,actionmailer tests fail a test关于Ruby 3.2的关键字参数.

因此,您有两种可能的方法来解决此问题:

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

作为一种快速解决办法,您现在可能可以先降级Ruby版本,然后开始进一步升级Rails应用程序,直到您可以再次升级Ruby版本.

Ruby-on-rails相关问答推荐

错误正在被ViewComponent、Ruby on Rails中吞噬

使用has_many_through关联创建记录 – Ruby on Rails

CanCanCan、Pagy 和 Meil​​iSearch,如何组合这 3 个 gem?

我需要在我的 Rails 7 应用程序中保留 app/assets/config/manifest.js 吗?

当我必须更改 rspec 中的方法时,如何检测时间?

Gem::Ext::BuildError:ERROR:无法在macOS Monterey上构建Gem本机扩展

Rails 3 的data-method='delete'如何优雅地降级?

如何使用 RSpec 和 Devise/CanCan 进行集成测试?

循环大量记录时 Ruby on Rails 内存泄漏; find_each 没有帮助

Rails:使用 RSpec 测试命名范围

如何将字符串转换为类方法?

升级到 ruby​​ 1.9.2 后奇怪的无法要求配置/ bootstrap

过滤器在渲染之前但在控制器之后执行?

非持久 ActiveRecord 模型属性

Ruby on Rails i18n - 想要在模型中翻译自定义消息

Ruby 根据属性在数组中查找并返回对象

从任何编码强制字符串为 UTF-8

在 Ruby on Rails 中的控制器中获取 URL 的锚部分

如何翻译 ActiveRecord 模型类名称?

如何创建迁移以仅在索引存在时删除索引,而不是在不存在时抛出异常?