【问题标题】:Rails 3 respond_with json questionRails 3 respond_with json 问题
【发布时间】:2011-05-11 05:24:21
【问题描述】:

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

当我这样做时:

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

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

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    我假设您要包含的 status 不是 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"
      }
    }
    

    我希望这就是你要找的。​​p>

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        @data = User.find(1)
        respond_with(@data, :include => :status)
        

        【讨论】:

        • 这对我很有用(即,在respond_with 调用中指定:include),但我似乎找不到任何文档,甚至在responders gem README 中也找不到.你是怎么知道要使用这个功能的?
        【解决方案4】:

        你现在可能已经解决了,但是如果你仍然遇到问题,如果你愿意,你可以这样做吗?

        @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

        【讨论】:

        • Na.. 试过了。不好。我仍然在 json 响应中得到一个空白状态对象。我知道如果我在普通视图中运行@data.status,我会得到对象。
        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2014-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多