私はこの質問にはすでに答えを持って知っているが、あなたはと呼ばれる使用できる素敵な宝石もあるactive_model_serializers 。これにより、さまざまなモデルのJSON出力に必要なプロパティを正確に指定したり、レスポンスに他のモデルとの関係を含めたりすることができます。
Gemfile:
gem 'active_model_serializers', '~> 0.10.0'
その後bundle install
を実行します。
その後、発電機のコマンドを使用してシリアライザを作成することができます。
project-root/app/serializers/
にシリアライザを作成します
rails g serializer user
。あなたのシリアライザで
、あなたが希望の属性をホワイトリストに登録することができます
は
プロジェクト・ルート/アプリ/シリアライザ/ user_serializer.rb:
class UserSerializer < ActiveModel::Serializer
attributes :id, :email
end
は今、いつでもあなたがUser
オブジェクトを返しますそれらの2つの属性、id
とemail
のみを出力します。
関連モデルを印刷したいですか?簡単です。シリアライザにリレーションシップを追加するだけで、関連するモデルがJSON出力に追加されます。
ユーザーをふりは記事 "多くを持っている":
class UserSerializer < ActiveModel::Serializer
attributes :id, :email
has_many :posts
end
今すぐあなたのJSON出力のようなものになります。
{
"id": 1,
"email": "[email protected]",
"posts": [{
id: 1,
title: "My First Post",
body: "This is the post body.",
created_at: "2017-05-18T20:03:14.955Z",
updated_at: "2017-05-18T20:03:14.955Z"
}, {
id: 2,
title: "My Second Post",
body: "This is the post body again.",
created_at: "2017-05-19T20:03:14.955Z",
updated_at: "2017-05-19T20:03:14.955Z"
},
...
]
}
かなりきちんとして便利に。また、特定の列だけを印刷するように投稿を制限したい場合は、posts
のシリアライザを作成し、属性を指定するだけで出力が機能します。
これは問題の正確な表現ではないと思います。 'render json:{user:user.pluck(:id、:email)、status:status}'はシリアル化されたユーザオブジェクト全体を返しません**。最小限のシナリオを提供するために問題を簡略化した場合は、まだ検証可能な記述であることを確認してください。 –
@TomLordあなたの提案は、エラーが発生しました。 '未定義のメソッド' pluck 'for#<ユーザ名> – AnApprentice
ああ、申し訳ありません、ここでは単一のオブジェクトを扱っていたことを忘れていました....だからあなたは* user.attributes .extract!( 'id'、 'name') '。しかし、as_jsonを使用する方が良いです。私の主張は、基本的には、あなたの質問にあなたのエラー**が記述されていないということでした。 –