Rails 3回答了json问题

时间:2011-05-11 05:24:22

标签: ruby-on-rails json activerecord respond-with

生成一些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结果集中显示得很好。但是它 在一个对象数组中,我不想要。

有什么想法吗?

5 个答案:

答案 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的原生特性。