Rails方法忽略默认参数 - 为什么?

时间:2011-05-21 17:38:42

标签: ruby-on-rails ruby-on-rails-3 methods parameter-passing

我不知道为什么会这样。我有以下功能:

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

这对任何人都有意义吗??非常感谢你的帮助。

1 个答案:

答案 0 :(得分:3)

这是因为您使用的是to_json,其默认optionsnilto_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