2011-05-21 74 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

相关问题