2017-08-16 52 views
0

我試圖使用Rails標籤幫助器在我的一個視圖中創建一個列表項,但當調用tag.linil參數時,我得到了ArgumentError爲什麼在調用帶有零參數的Rails標記助手時會出現ArgumentError?

的代碼中的錯誤出現的部分看起來像這樣:

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

和錯誤消息說:只有當logged_in?回報falsenil作爲參數傳遞出現 wrong number of arguments (given 3, expected 1..2)

問題。我試着用下面的代碼,並能夠得到同樣的錯誤:

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

如果tag.li第二個參數是可選的,爲什麼我收到這個錯誤?

當然,我可以簡單地做<%= tag.li('Some text', logged_in? ? {class: 'active'} : {}) %>,但不知道這個錯誤背後的原因真的讓我感到困擾。

回答

0

出現這種情況是Rails是看到的原因,如爲tag_string呼叫:

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

它採用雙圖示**運算符將最後一個參數轉換爲散列。那麼如果你不通過哈希會發生什麼?

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"} 

所以的參數錯號僅僅是錯誤的紅寶石當你搞砸**運算符時不會給它一個散列值。最初,這確實是一個令人困惑的錯誤,但考慮一點,國際海事組織,這是有道理的。這就是這裏發生的一切。

0

看起來好像tag.li期待散列作爲參數。如果你,如果你改變你的代碼,以得到一個錯誤請參見:

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

我假設你的意思 <%= tag.li( '一些文本',LOGGED_IN {類: '活躍'}?{})%> 是的,我想,它工作得很好。但是,這並不能解釋爲什麼Rails告訴我我試圖傳遞3個參數。 –

相關問題