2017-06-12 7 views
1

は、私が現在持っている: Rails、コントローラのJSONレスポンスで出力するフィールドを指定する方法は?私のコントローラで

invite = Invite.find_by_token(params[:id]) 
user = invite.user 

json_response({ 
    user: user 
}) 

def json_response(object, status = :ok) 
    render json: object, status: status 
end 

今、ユーザーがすべてのユーザーフィールドを返しています。私はちょうど(ID、Eメール)に戻りたいと思っています。私は試しました:

どちらも動作しません。アイデア?

+1

これは問題の正確な表現ではないと思います。 'render json:{user:user.pluck(:id、:email)、status:status}'はシリアル化されたユーザオブジェクト全体を返しません**。最小限のシナリオを提供するために問題を簡略化した場合は、まだ検証可能な記述であることを確認してください。 –

+0

@TomLordあなたの提案は、エラーが発生しました。 '未定義のメソッド' pluck 'for#<ユーザ名> – AnApprentice

+1

ああ、申し訳ありません、ここでは単一のオブジェクトを扱っていたことを忘れていました....だからあなたは* user.attributes .extract!( 'id'、 'name') '。しかし、as_jsonを使用する方が良いです。私の主張は、基本的には、あなたの質問にあなたのエラー**が記述されていないということでした。 –

答えて

2

あなたは方法as_json通過は次のように、あなたが応答したい属性を使用することができます。

user.as_json(only: [:id, :email])

+0

完璧です。ありがとうございました – AnApprentice

2

私はこの質問にはすでに答えを持って知っているが、あなたはと呼ばれる使用できる素敵な宝石もある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つの属性、idemailのみを出力します。

関連モデルを印刷したいですか?簡単です。シリアライザにリレーションシップを追加するだけで、関連するモデルが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のシリアライザを作成し、属性を指定するだけで出力が機能します。

関連する問題