如何在运行时使ActiveModel :: Serializer属性可选?

时间:2015-09-09 18:55:50

标签: ruby-on-rails ruby active-model-serializers

我正在尝试允许API请求指定要在对象上返回的字段。我可以仅使用指定的字段检索对象,但是在序列化时,它会抛出错误:

ActiveModel::MissingAttributeError (missing attribute: x)

如何使用ActiveModel::Serializer实现此功能,是否可能?

2 个答案:

答案 0 :(得分:1)

这是因为Serializer.attributes方法使用ActiveModel.read_attribute方法调用每个字段。此方法将应用一些验证,例如模型定义中的validates_presence_of,这将引发异常。为了避免这种情况,我提供三个不良解决方案之后更好更简单的解决方案:

  • 更改模型定义,但您将错过验证。
  • 覆盖方法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 )

答案 1 :(得分:0)

我在寻找一个好的方法来从json响应中删除可选字段时发现了这个问题。

宝石active_model_serializers确实有解决方案。您只需要在序列化程序声明中将条件传递给attribute方法即可。

class MySelectiveSerializer < ActiveModel::Serializer
  attributes :id, :anything
  attribute :something, if: -> { object.something.present? }
end

也许3年前没有这样的解决方案,但是现在可以使用。 :)

干杯。