2016-04-12 54 views
0

我需要允許爲每個帳戶定製json輸出。一個人可能會喜歡標準的json響應。另一個可能希望擁有完全相同的提要,除非他們需要名爲「account_name」的「名稱」字段或其他內容。在Rails響應中更改JSON字段名稱

因此,與一個標準的用戶,他們可能樂於同

@model.to_json(only: [:name, :title, :phone]) 

另一個用戶可能希望看到自己的JSON響應爲

@model.to_json(only: [:name (AS ACCOUNT_NAME) , :title, :phone]) 

我發現,覆蓋as_json/to_json的解決方案模型,但這些似乎是影響每個人的解決方案。我如何才能在每個訪問/每個帳戶的基礎上更改它們?

+1

沒有「Rails的方式」來做到這一點,因爲這是一件非常奇怪的事情想要做。你打算如何存儲自定義字段名稱?取決於您自定義的字段映射,並將其應用於任何前端處理請求的'as_json'輸出。 – meagar

+0

字段別名將存儲在某種模板中,或者只是重新映射「set name = new_name」或類似內容。一些用戶後端需要不同的輸入,所以我不得不容納 –

+0

@ 7urkm3n這不是遠程有效的語法,但要公平起見,問題中的示例也不是有效的語法。 – meagar

回答

2

我覺得在你的情況下,最好是將邏輯推到view層,使代碼乾淨,通過使用Jbuilder。 因此,而不是覆蓋to_json方法,你可以這樣做如下:

# app/views/users/show.json.jbuilder 

json.model_name do 
    json.title @current_user.title 
    json.phone @current_user.phone 
    if current_user.type_account_name? # need to implement this logic somewhere in your app 
    json.account_name @current_user.name 
    else 
    json.name @current_user.name 
    end 
end 

更新

控制器看起來像這樣

class UsersController < ApplicationController 
    def show 
    @user = User.find(params[:id]) 
    end 
end 
+0

謝謝,我可以用這個工作。這個控制器看起來像什麼? –

+0

Jbuilder是rails的一部分,所以如果你不想返回html版本,但只是json版本,你實際上可以簡單地刪除'@ model.to_json(只:[:name,:title,:phone])' ,只要確保分配了「@ model」即可。那麼rails會自動爲你呈現jbuilder模板 –

+0

謝謝,我會試試這個 –