为什么在使用 nil 参数调用 Rails 标签助手时出现 ArgumentError?



我正在尝试使用 Rails 标签助手在我的一个视图中创建一个列表项,但在用nil参数调用tag.li时遇到ArgumentError

出现错误的代码部分如下所示:

<ul>
<%= tag.li('Some text', logged_in? ? {class: 'active'} : nil) %>
</ul>

错误消息说:wrong number of arguments (given 3, expected 1..2)

仅当logged_in?返回false并且nil作为参数传递时,才会出现此问题。我尝试使用以下代码,并能够得到相同的错误:

<ul>
<%= tag.li('Some text', nil) %>
</ul>

如果tag.li的第二个参数是可选的,为什么会出现该错误?

当然,我可以简单地做<%= tag.li('Some text', logged_in? ? {class: 'active'} : {}) %>但不知道错误背后的原因真的很困扰我。

发生这种情况的原因是rails将其视为对tag_string的调用:

<%= tag.tag_string('li', 'Some Text', nil) %>

它使用双 splat**运算符将最后一个参数转换为哈希。那么,如果您不传递哈希会发生什么?

def double_splat_test(**args)
puts args.inspect
end
double_splat_test(nil)
# ArgumentError: wrong number of arguments (given 1, expected 0)

对于您传递的任何非哈希值,都会发生这种情况:

double_splat_test('not a hash')
# ArgumentError: wrong number of arguments (given 1, expected 0)

但与哈希配合得很好:

double_splat_test(something: 'goes here')
# {:something=>"goes here"}

因此,错误的参数数量只是 ruby 在你弄乱**运算符并且不给它一个哈希时选择给出的错误。最初,可以肯定的是,这是一个令人困惑的错误,但稍微考虑一下,IMO,这是有道理的。这就是这里发生的一切。

似乎tag.li期待哈希作为参数。 查看将代码更改为以下代码是否出现错误:

<ul>
<%= tag.li('Some text', logged_in? ? {class: 'active'} : {) %>
</ul>

最新更新