2

无法生成一些 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=>:status 似乎没有带来关系。在我的用户模型中,我有一个 belongs_to :status。我如何让它在单个结果集上工作?

当我这样做时:

@data = User.where("id = 1")
respond_with(@data, :include => :status)

这种关系很好地显示在 json 结果集中。但它在我不想要的对象数组中。

有任何想法吗?

4

5 回答 5

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"
  }
}

我希望这就是你要找的。

于 2012-01-19T22:47:32.297 回答
4

听起来您在使用内置的 rails 序列化时遇到了一些相同的痛苦。我最终使用了 RABL 模板,这让我的生活变得轻松多了。如果您需要快速启动和运行 RABL 的指南,我整理了一份:

http://blog.dcxn.com/2011/06/22/rails-json-templates-through-rabl/

于 2011-06-22T05:09:56.023 回答
3

where返回一个数组,所以你的结果是有意义的。您需要where().first,或者因为它只是一个 ID 查找,只需使用find.

这是很久以前的事了,但仍然是最简洁的答案:

@data = User.find(1)
respond_with(@data, :include => :status)
于 2013-07-25T19:21:09.447 回答
2

伙计,您现在可能已经解决了,但是如果您仍然遇到问题,您可以根据需要这样做吗?

@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

于 2011-05-11T06:34:47.147 回答
1

正如 nixterrimus 指出的那样,RABL 确实是要走的路。它简单、干净、优雅。我对 Rails 比较陌生,没有使用过这些技术(to_json 等),但是做了一些研究并实际使用了 RABL,我不禁想知道为什么它不是 Rails 的原生特性。

于 2011-09-13T04:56:53.993 回答