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

时间:2017-08-16 20:49:58

标签: ruby-on-rails

我正在尝试使用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'} : {}) %>,但不知道错误背后的原因真的让我烦恼。

2 个答案:

答案 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,这是有道理的。这就是这里发生的一切。