我不知道为什么会发生这种情况。 我有以下功能:
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 %>
我收到以下错误:
操作视图::模板::错误(当你没有预料到它时,你有一个 nil 对象!您可能期望数组的实例。评估 nil 时发生错误。[]):
指向"除非选项[:简单]"行。 据我所知,选项哈希为零 - 因此该方法忽略了默认的参数赋值。 为什么? 我可以通过将方法更改为:
def as_json(options)
options ||= {}
json = {
:id => id,
# ... more unimportant code
}
unless options[:simple]
# ... more unimportant code
end
json
end
这对任何人都有意义吗!? 非常感谢您的帮助。
这是因为您使用的是 to_json
,它的默认options
为 nil
。 to_json
最终会打电话给as_json
,并将nil
作为options
传递。
这是它在Rails源代码上发生的地方。首先,to_json
是用默认options
nil
定义的。
# 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
。