重写 as_json 方法没有效果?

4

我正在尝试在我的一个模型中重写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输出,那么我只是语法写错了吗?


顺便说一句 - 我在阅读http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/之后做到了这一点。 - Ola Tuvesson
请参见https://dev59.com/GkzSa4cB1Zd3GeqPqutK的相关内容。 - Ola Tuvesson
请访问 https://rails.lighthouseapp.com/projects/8994/tickets/3087。 - Ola Tuvesson
2个回答

2

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(),并在模型中重写 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"}
    ]
}

...这就是预期的输出。我发现了一个bug吗?我能赢得奖品吗?


你是否安装了一个定义了自己的 to_jsonas_json 的插件或其他东西? - x1a4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接