2017-06-12 40 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,電子郵件)...我已經嘗試過:

user = invite.user.select(:id, :email) 
user = invite.user.pluck(:id, :email) 

既不可行。想法?

+1

我不認爲這是您的問題的準確表示。 'render json:{user:user.pluck(:id,:email),status:status}'will ** not **返回整個序列化的用戶對象。如果你已經簡化了這個問題,試圖提供一個最小的方案,你能確保它仍然是一個可驗證的描述嗎? –

+0

@TomLord @TomLord你的建議導致錯誤'undefined method'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

您可以然後使用生成器命令創建一個串行:

rails g serializer user

將在project-root/app/serializers/創建序列化。

在你的序列化,你可以白名單的屬性,你想:

項目根/應用/串行器/ user_serializer.rb

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email 
end 

現在任何時候你返回一個對象User它只會輸出這兩個屬性,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創建一個序列化程序,指定屬性,並且輸出將正常工作。

相關問題