【问题标题】:Rails Method Ignoring Default Param - WHY?Rails 方法忽略默认参数 - 为什么?
【发布时间】:2011-08-30 07:33:51
【问题描述】:

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

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 时发生错误。[]):

指向“除非 options[:simple]”这一行。据我所知,选项哈希为 nil - 因此该方法忽略了默认参数分配。为什么?我可以通过将方法更改为:

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

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

【问题讨论】:

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


    【解决方案1】:

    这是因为您使用的是to_json,它的默认optionsnilto_json 最终将调用as_json 并将nil 传递为options

    这是在 Rails 源代码中发生的地方。首先,to_json 定义为默认的optionsnil

    # 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

    【讨论】:

    • 非常感谢您的出色回复 - 它非常清晰且内容丰富!
    • 最后一个问题。在发布此问题之前,我尝试使用控制台调用 to_json,以查看问题是否与该函数有关。但是在控制台中, to_json 和 as_json 都可以正常工作。知道为什么控制台没有生成错误吗?
    • 对我来说,它在控制台上的行为符合预期。也许您当时没有重新加载或重新启动控制台以反映代码。
    • 您关于重新加载可能是对的。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    相关资源
    最近更新 更多