2015-09-09 52 views

回答

1

您可以從串行刪除屬性,但它們應該存在。

class SomeSerializer < ActiveModel::Serializer 
    attributes :something 

    def attributes 
    super.except(:something) if something 
    end 
end 
-1

您可以通過在序列化程序中實現方法來自定義屬性。請注意,我描述了最新的穩定版(寫這篇文章的時候)0.9.x分支。

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :body, :author 

    def filter(keys) 
    if scope.admin? 
     keys 
    else 
     keys - [:author] 
    end 
    end 
end 
+0

不解決問題過濾器在查找所有屬性後調用,所以仍然拋出錯誤。 – Adamantish

1

這是因爲Serializer.attributes方法使用ActiveModel.read_attribute方法調用的每個字段。該方法將應用一些驗證,如模型定義中的validates_presence_of,這將引發異常。爲了避免它,我給3壞的解決方案一個更好,更簡單的一個後:

  • 改變模型的定義,但你會想念你的驗證。
  • 覆蓋方法ActiveModel.read_attribute來處理這種行爲,你將會遇到新的挑戰。
  • 覆蓋Serializer.attributes而不是致電,請致電object.attributes

但最好的選擇將創建一個新的序列化類,以避免除了效果,只有你想要的字段。然後,在控制器類指定此:

render json: People.all.reduced, each_serializer: SimplePersonSerializer 

編輯1

正確的答案應該是從Maurício Linhares之一。

render json: result.to_json(only: array_of_fields) 
+0

最終的建議不符合挑戰。 OP希望API消費者能夠指定任何字段組合,而不是特定的預定義子集。 – Adamantish

+0

@Adamantish謝謝你,我沒有意識到它應該是靈活的,我的壞=( – voiski

相關問題