生成一些json时遇到问题。我想渲染一个 像json这样的单个活动记录结果:
@data = User.find(1)
respond_with(@data, :include => :status)
json结果是:
{
-user: {
address: null
email: "test@email.com"
first_name: "Test"
last_name: "Man"
status_id: 1
username: "testguy"
status: { }
}
}
那么问题是什么?问题是:include =>:状态似乎 不要带来这种关系。在我的用户模型中,我有一个 belongs_to:status。如何在单个结果集上使用它?
当我这样做时:
@data = User.where("id = 1")
respond_with(@data, :include => :status)
这种关系在json结果集中显示得很好。但是它 在一个对象数组中,我不想要。
有什么想法吗?
答案 0 :(得分:7)
我认为您要包含的状态不是http状态代码(200,201等)之一,也不是以任何方式与User对象关联的对象,而是您自己的变量
使用Rails 3.0.10和Ruby 1.9.2,您可能会发现这两种解决方案中的一种适合您。而不是respond_with
使用render
如下。
解决方案1
render :json => {:data => @data, :status => "whatever"}
json结果是:
{
data:
{
user:
{
address: null
email: "test@email.com"
first_name: "Test"
last_name: "Man"
status_id: 1
username: "testguy"
}
}
status: "whatever"
}
解决方案2
render :json => {:user => {:address => @data.address, :email => @data.email, ..., :status => "whatever"}}
json结果是:
{
user:
{
address: null
email: "test@email.com"
...
status: "whatever"
}
}
我希望这就是你要找的东西。
答案 1 :(得分:4)
听起来你在使用内置导轨序列化时遇到了一些相同的痛苦。我最终使用了RABL模板,这让我的生活变得更轻松。如果你需要一本关于快速启动和运行RABL的指南,我会把它放在一起:
http://blog.dcxn.com/2011/06/22/rails-json-templates-through-rabl/
答案 2 :(得分:3)
where
返回一个数组,因此您的结果很有意义。您需要where().first
,或者因为它只是ID查找,只需使用find
。
这是很久以前的事了,但这仍然是最简洁的答案:
@data = User.find(1)
respond_with(@data, :include => :status)
答案 3 :(得分:1)
你现在可能已经解决了它的问题,但如果你还在使用probs,你可以这样做吗?
@data = User.find(1, :include => :status)
respond_to do |format|
format.json do
render @data.to_json(:include => :status)
end
end
如果不起作用,您的关联可能会出现问题。关于'渴望加载协会'的api中有一个非常好的部分:
http://apidock.com/rails/ActiveRecord/Associations/ClassMethods
答案 4 :(得分:1)
正如nixterrimus指出的那样,RABL真的是要走的路。它简单,干净,优雅。我对rails很新,并没有使用这些技术(to_json等),但是做了一些研究并实际使用RABL,我不禁想知道为什么它不是Rails的原生特性。