0

我在 Rails 中遇到与我的一个模型相关的错误,我们称之为Unit. 以下代码会产生错误:

format.json { render :json => @units.as_json }

错误是关于错误数量的参数(0 of 1)。

4

2 回答 2

0

我相信你想要的是;

def scheme
  @object = MonitoringObject.restricted_find params[:id], session[:client]

  @units = Unit.where("object_id = ?", @object.id)

  respond_to do |format|
    format.html
    format.json { render :json => @units[0] }
  end
end

或者,如果您正确设置了MonitoringObjectUnit模型之间的关系,

def scheme
  @object = MonitoringObject.restricted_find params[:id], session[:client]
  @units = @object.units

  respond_to do |format|
    format.html
    format.json { render :json => @units[0] }
  end
end

您正在为它提供一个:except空参数。

:except如果您不希望 JSON 响应中包含某些属性,您将使用条件。

根据有关视图和渲染的 rails 指南,您无需指定.to_json- 它会自动为您调用。

在我看来,问题可能出在你的.restricted_find方法上。您可以发布整个堆栈跟踪)或链接到包含它的 github gist 吗?

于 2012-05-03T14:25:55.357 回答
0

我解决了这个问题。来自 Rails 源代码:

  module Serialization
    def serializable_hash(options = nil)
      options ||= {}

      attribute_names = attributes.keys.sort
      if only = options[:only]
        attribute_names &= Array.wrap(only).map(&:to_s)
      elsif except = options[:except]
        attribute_names -= Array.wrap(except).map(&:to_s)
      end

      hash = {}
      attribute_names.each { |n| hash[n] = read_attribute_for_serialization(n) } # exception here

      # ...
    end

    alias :read_attribute_for_serialization :send

    # ...
  end

  # ...
end

所以真正的错误是调用 eg Unit.first.attributes.keys.sort( ["dev_id", "flags", "id", "inote", "ip", "location_id", "model_id", "name", "period", "phone", "port", "snote", "timeout"]) 返回的方法之一希望我将参数传递给它。这个方法是timeout,它是 Rails 猴子修补 Object 的一些私有方法。所以解决这个问题的正确方法是把这个属性重命名为别的东西。

于 2012-05-11T15:23:47.797 回答