我不知道为什么会这样。我有以下功能:
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 :: Template :: Error(当你没想到它时,你有一个nil对象! 您可能期望一个Array实例。 在评估nil时发生错误。[]):
指向“除非选项[:simple]”这一行。据我所知,options hash是nil - 因此该方法忽略了默认的param赋值。为什么?我可以通过将方法更改为:
来解决此问题def as_json(options)
options ||= {}
json = {
:id => id,
# ... more unimportant code
}
unless options[:simple]
# ... more unimportant code
end
json
end
这对任何人都有意义吗??非常感谢你的帮助。
答案 0 :(得分:3)
这是因为您使用的是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
。