我想讓一個API請求來指定對象返回的字段。我可以檢索,只有指定的字段的對象,但是當它被序列化,它拋出一個錯誤:如何在運行時使ActiveModel :: Serializer屬性可選?
ActiveModel::MissingAttributeError (missing attribute: x)
我怎樣才能實現與ActiveModel::Serializer
此功能,這可能嗎?
我想讓一個API請求來指定對象返回的字段。我可以檢索,只有指定的字段的對象,但是當它被序列化,它拋出一個錯誤:如何在運行時使ActiveModel :: Serializer屬性可選?
ActiveModel::MissingAttributeError (missing attribute: x)
我怎樣才能實現與ActiveModel::Serializer
此功能,這可能嗎?
您可以從串行刪除屬性,但它們應該存在。
class SomeSerializer < ActiveModel::Serializer
attributes :something
def attributes
super.except(:something) if something
end
end
您可以通過在序列化程序中實現方法來自定義屬性。請注意,我描述了最新的穩定版(寫這篇文章的時候)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
這是因爲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)
最終的建議不符合挑戰。 OP希望API消費者能夠指定任何字段組合,而不是特定的預定義子集。 – Adamantish
@Adamantish謝謝你,我沒有意識到它應該是靈活的,我的壞=( – voiski
不解決問題過濾器在查找所有屬性後調用,所以仍然拋出錯誤。 – Adamantish