Ruby 3.0 - 参数数量错误(给定 3 个,预期为 1..2)

Ruby 3.0 - wrong number of arguments (given 3, expected 1..2)

提问人:Risha 提问时间:3/2/2023 最后编辑:DeepeshRisha 更新时间:10/30/2023 访问量:1927

问:

我们有一个使用 uk_postcode gem 的项目。有一个验证器类,如下所示:

class UkPostcodeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    postcode = UKPostcode.parse(value.to_s)
    return if postcode.full_valid?

    record.errors.add attribute, :invalid_uk_postcode, options
  end
end 

以上内容在 Ruby 2.7.6 中工作正常,但现在我需要更新到 Ruby 3.0.0。当我这样做时,我们的测试会中断并给出以下错误:

Failure/Error: record.errors.add attribute, :invalid_uk_postcode, options
     
     ArgumentError:
       wrong number of arguments (given 3, expected 1..2) 

我对 Ruby 和 Rails 的了解还不是很好,但在网上搜索了这么多并尝试了不同的东西之后,我发现改变以修复测试。因此,在最后一个参数中添加 ** 可以修复测试,并且似乎验证可以正常工作。从我目前所读到的内容来看,参数似乎必须更加具体,并且通过添加 ** 使其成为关键字参数(我假设它可以采用任何类型/值),但由于我还不是 Ruby 和 Rails 的专家,这更像是一种猜测,而不是正确理解这一点。record.errors.add attribute, :invalid_uk_postcode, optionsrecord.errors.add attribute, :invalid_uk_postcode, **options

有人可以更好地指导吗?以这种方式修复上述更改似乎可以吗?为什么在最后一个参数中添加 ** 可以解决错误问题?

我不确定 atm,指的是什么选项以及我将在未来研究的内容,但任何知道并能回答的人将不胜感激。谢谢

在线搜索错误,可以看到 Ruby 语法有更改。试图理解这一点。

Ruby-On-Rails 验证 Ruby-3

评论

0赞 Deepesh 3/2/2023
在上述情况下,价值是什么?options

答:

10赞 Deepesh 3/3/2023 #1

关键字参数现在与位置参数完全分离

def new_style(name, **options)
end

new_style('John', {age: 10})
# Ruby 2.6: works
# Ruby 2.7: warns: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
# Ruby 3.0: ArgumentError (wrong number of arguments (given 2, expected 1))
new_style('John', age: 10)
# => works
h = {age: 10}
new_style('John', **h)
# => works, ** is mandatory

方法的定义是:add

def add(attribute, type = :invalid, **options)

因此,现在不支持在没有的情况下传递哈希值。相反,你可以直接将它们作为关键字参数传递,如下所示:options****

record.errors.add attribute, :invalid_uk_postcode, count: 25, other_attr: 'any text'

详细文章在这里: https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/

评论

0赞 max 3/3/2023
这里的方法有点无关紧要。使用哈希作为定位参数的方法不会受到 Ruby 3 中更改的影响。old_style