2011-05-21 94 views
4

我不知道爲什麼會發生這種情況。我有以下功能:Rails方法忽略默認參數 - 爲什麼?

def as_json(options = {}) 
    json = { 
    :id => id, 
    # ... more unimportant code 
    } 
    unless options[:simple] 
    # ... more unimportant code 
    end 
    json 
end 

它工作的大部分時間,但在一個特定的部分,我稱之爲:

window.JSONdata = <%= @day.to_json.html_safe %> 

我得到以下錯誤:

::的ActionView模板::錯誤(當你沒有想到它的時候,你有一個零對象! 你可能已經預期了一個數組的實例 評估爲零時發生錯誤[]):

指向該行「除非選項[:簡單]」。據我所知,選項散列是零 - 因此該方法是忽略默認的參數分配。爲什麼?我可以通過更改方法來解決此問題:

def as_json(options) 
    options ||= {} 
    json = { 
    :id => id, 
    # ... more unimportant code 
    } 
    unless options[:simple] 
    # ... more unimportant code 
    end 
    json 
end 

這對任何人都有意義嗎?最感謝您的幫助。

回答

3

這是因爲您使用的是to_json,它的默認optionsnilto_json最終會撥打as_json並通過nil作爲options

這是Rails源代碼發生的地方。首先,to_json定義爲nil的默認options

# https://github.com/rails/rails/blob/v3.0.7/activesupport/lib/active_support/core_ext/object/to_json.rb#L15 
def to_json(options = nil) 
    ActiveSupport::JSON.encode(self, options) 
end 

最終它會到達這裏。

# https://github.com/rails/rails/blob/v3.0.7/activesupport/lib/active_support/json/encoding.rb#L41 
def encode(value, use_options = true) 
    check_for_circular_references(value) do 
    jsonified = use_options ? value.as_json(options_for(value)) : value.as_json 
    jsonified.encode_json(self) 
    end 
end 

正如你看到的,as_json被稱爲與value.as_json(options_for(value))options_for(value)將返回to_json的默認值,這是nil

+0

非常感謝大家的迴應 - 這真的很清楚,內容翔實! – Tyler 2011-05-22 16:01:38

+0

最後一個問題。在發佈此問題之前,我嘗試使用控制檯調用to_json以查看問題是否與該函數相關。但是在控制檯中,to_json和as_json都正常工作。任何想法爲什麼控制檯不會產生錯誤? – Tyler 2011-05-22 16:11:04

+0

它在控制檯上的行爲與我的預期相同。也許你沒有重新加載或重新啓動控制檯以反映當時的代碼。 – htanata 2011-05-23 07:06:56