我正在尝试使用Rails标记助手在我的一个视图中创建一个列表项,但在使用ArgumentError
参数调用tag.li
时我得到nil
。
出现错误的代码部分如下所示:
<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'} : {}) %>
,但不知道错误背后的原因真的让我烦恼。
答案 0 :(得分:0)
似乎tag.li
期望哈希作为参数。如果您将代码更改为:
<ul>
<%= tag.li('Some text', logged_in? ? {class: 'active'} : {) %>
</ul>
答案 1 :(得分:0)
这种情况发生的原因是rails将tag_string
称为:{/ p>
<%= 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,这是有道理的。这就是这里发生的一切。