覆盖as_json没有效果?

时间:2010-05-27 21:01:12

标签: ruby-on-rails json model override

我试图在我的一个模型中覆盖as_json,部分是为了包含来自另一个模型的数据,部分是为了删除一些不必要的字段。从我所看到的,这是Rails 3中的首选方法。为了保持简单,让我说我有类似的东西:

class Country < ActiveRecord::Base
  def as_json(options={})
    super(
      :only => [:id,:name]
    )
  end
end

在我的控制器中

def show
  respond_to do |format|
    format.json  { render :json => @country }
  end
end

然而,无论我尝试什么,输出始终包含完整数据,字段不会被“:only”子句过滤。基本上,我的覆盖似乎没有开始,但如果我改变它,说...

class Country < ActiveRecord::Base
  def as_json(options={})
    {foo: "bar"}
  end
end

...我确实得到了预期的JSON输出。我只是弄错了语法吗?

2 个答案:

答案 0 :(得分:2)

这是一个错误,但没有奖品:

https://rails.lighthouseapp.com/projects/8994/tickets/3087

答案 1 :(得分:0)

在控制器操作中进行了一些进一步的测试:

format.json { render :json => @country }

在模型中:

class Country < ActiveRecord::Base
    has_many :languages
    def as_json(options={})
        super(
            :include => [:languages],
            :except => [:created_at, :updated_at]
        )
    end
end

输出:

{
    created_at: "2010-05-27T17:54:00Z"
    id: 123
    name: "Uzbekistan"
    updated_at: "2010-05-27T17:54:00Z"
}

但是,明确地将.to_json()添加到类中的render语句,并覆盖模型中的to_json(而不是as_json)会产生预期的结果。有了这个:

format.json { render :json => @country.to_json() } 

在我的控制器操作中,以及模型中的下面,覆盖工作:

class Country < ActiveRecord::Base
    has_many :languages
    def to_json(options={})
        super(
            :include => [:languages],
            :except => [:created_at, :updated_at]
        )
    end
end

输出......

{
    id: 123,
    name: "Uzbekistan",
    languages: [
        {id: 1, name: "Swedish"},
        {id: 2, name: "Swahili"}
    ]
}

...这是预期的输出。我发现了一个错误吗?我赢了奖吗?