2014-04-01 50 views
0

所以我在使用內部使用的寶石時發現了這個奇怪的異常。Rails/Ruby發送方法不能用params建立路徑?

我們有這樣的私有方法

private 
def redirect_to_element(element, next_upload) 
    send("scorecard_#{element.base_class_name.underscore}_path", current_scorecard, current_tab(element, next_upload)) 
end 

剛剛建立動態根據傳遞給它什麼元素的路徑。我想要做的是讓那些動態路徑通過一些參數。但我得到這個錯誤

undefined method `scorecard_enterprise_development_path(ignore_tracking: true)' for #<#<Class:0x007ff767a702e0>:0x007ff767899a20> 

所以在控制檯我想幾件事情,這是我發現了什麼。

>> scorecard_enterprise_development_path 
=> "/scorecards/338/enterprise_development" 

>> send('scorecard_enterprise_development_path') 
=> "/scorecards/338/enterprise_development" 

>> scorecard_enterprise_development_path(ignore_tracking: true) 
=> "/scorecards/338/enterprise_development?ignore_tracking=true" 

>> send('scorecard_enterprise_development_path(ignore_tracking: true)') 
!! #<NoMethodError: undefined method `scorecard_enterprise_development_path(ignore_tracking: true)' for #<#<Class:0x007ff767a702e0>:0x007ff767899a20>> 

使用send方法使用參數構建路徑將失敗。誰能解釋爲什麼會發生這種情況?

我使用,紅寶石-v 1.9.3p327和軌道-v 3.2.16

回答

2

#send將調用由第一個參數確定方法,並通過它指定的任何參數。

所以,你應該使用的方法是這樣的:

send('scorecard_enterprise_development_path', ignore_tracking: true) 

send documentation

+0

這工作在控制檯中。只有它看起來好像有一些限制你能傳遞多少?如果我將方法設置爲send(「scorecard _#{element.base_class_name.underscore} _path」,ignore_tracking:true,current_scorecard,current_tab(element,next_upload)),則'語法錯誤,意外',',期待tASSOC' – TheLegend

+0

嘗試使用'send(「scorecard _#{element.base_class_name.underscore} _path」,{ignore_tracking:true},current_scorecard,current_tab(element,next_upload))'? – ouranos

+0

酷你的男人,我剛剛添加了'ignore_tracking:true'作爲最後一個參數,它效果很好!萬分感謝 – TheLegend