我正在尝试使用 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>