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 %>

我收到以下错误:

操作视图::模板::错误(当你没有预料到它时,你有一个 nil 对象!您可能期望数组的实例。评估 nil 时发生错误。[]):

指向"除非选项[:简单]"行。 据我所知,选项哈希为零 - 因此该方法忽略了默认的参数赋值。 为什么? 我可以通过将方法更改为:

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

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

这是因为您使用的是 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

相关内容

  • 没有找到相关文章

最新更新