Ruby 3.2调用带关键字参数的函数时参数数量错误排查
问题原因
Ruby 3.0+ 对关键字参数和普通哈希做了严格区分,而旧版本 Rails(低于6.1.7)在处理 Mailer 类方法调用时,会将传入的关键字参数打包成一个单一哈希传递给实例方法。你的实例方法定义的是必填关键字参数,但实际收到的是一个哈希参数,因此触发 ArgumentError。
解决方案
方案1:升级Rails到兼容版本
Ruby 3.2.0 需要搭配 Rails 6.1.7 或更高版本使用,这些版本已经修复了 Ruby 3 关键字参数的兼容问题。升级后,Rails 会正确处理 Mailer 类方法的关键字参数传递,无需修改现有代码。
方案2:修改实例方法参数定义(兼容旧版Rails)
如果暂时无法升级 Rails,可以修改 notify 方法的参数接收方式,同时支持哈希和关键字参数:
class NotificationsMailer < ApplicationMailer VENDOR_SUPPORT_EMAIL = "vendor-support@saatvamattress.com" def notify(**args) recipient_emails = args.fetch(:recipient_emails) subject = args.fetch(:subject) body = args.fetch(:body) @body = body @subject = subject mail(bcc: recipient_emails, subject: @subject, reply_to: VENDOR_SUPPORT_EMAIL) end end
使用 **args 可以接收任意关键字参数并打包成哈希,再通过 fetch 确保必填参数存在,既兼容 Ruby 3 的关键字参数调用,也适配旧版 Rails 的哈希传递逻辑。
方案3:调用时显式展开哈希(临时 workaround)
在测试或业务代码中调用时,将关键字参数打包成哈希并通过 ** 展开:
NotificationsMailer.notify(**{ recipient_emails: recipient_emails, subject: 'subject', body: 'body' })
但这个方法治标不治本,建议优先选择前两种方案。
内容的提问来源于stack exchange,提问作者Daniel Valencia
相关产品推荐
相关产品推荐

