You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:10:24