我试图在我的一个模型中覆盖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输出。我只是弄错了语法吗?
答案 0 :(得分:2)
答案 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"}
]
}
...这是预期的输出。我发现了一个错误吗?我赢了奖吗?