2

json の生成に問題があります。次のように、1 つのアクティブ レコードの結果を 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 が関係を引き継がないように見えることです。私の User モデルには、belongs_to :status があります。これを単一の結果セットで機能させるにはどうすればよいですか?

私がこれを行うとき:

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

関係は、このようにうまくjson結果セットに表示されます。しかし、それは私が望んでいないオブジェクトの配列内にあります。

何か案は?

4

5 に答える 5

7

含めたいステータスは、httpステータスコード(200、201など)の1つでも、Userオブジェクトに関連付けられたオブジェクトでもなく、独自の変数である想定しています。

Rails 3.0.10 と Ruby 1.9.2 を使用すると、これら 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 に答える
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 に答える