如何使用 Rails 序列化程序 return 对象的所有属性?

How to return all attributes of an object with Rails Serializer?

我有一个简单的问题。我有一个看起来像这样的序列化器:

class GroupSerializer < ActiveModel::Serializer
  attributes :id, :name, :about, :city 
end

问题是,每当我更改模型时,我都必须 add/remove 来自此序列化程序的属性。我只想默认获取整个对象,如默认 rails json 响应:

render json: @group

我该怎么做?

尝试以下方法获取 Group class 的所有属性键:

Group.new.attributes.keys

例如,我在一个应用程序上为用户获取以下信息:

> User.new.attributes.keys
=> ["id", "password_digest", "auth_token", "password_reset_token", "password_reset_requested_at", "created_at", "updated_at"]

至少在 0.8.2 的 ActiveModelSerializers 上,您可以使用以下内容:

class GroupSerializer < ActiveModel::Serializer
  def attributes
    object.attributes.symbolize_keys
  end
end

小心这个,因为它会添加您的对象附加到它的 每个 属性。您可能希望在序列化程序中加入一些过滤逻辑,以防止显示敏感信息(即加密密码等)

这并没有解决关联问题,尽管稍加挖掘您可能会实现类似的东西。

============================================= ===============

更新:2016 年 1 月 12 日

在 ActiveModelSerializers 的 0.10.x 版本中,attributes 默认接收两个参数。我添加了 *args 以避免异常:

class GroupSerializer < ActiveModel::Serializer
  def attributes(*args)
    object.attributes.symbolize_keys
  end
end

只是添加到@kevin 的回答中。我也在寻找如何在返回的属性上添加过滤器。我查看了文档 active_model_serializers 0.9,它确实支持如下所示的过滤器:

  def attributes
    object.attributes.symbolize_keys
  end
  def filter(keys)
          keys - [:author, :id]
  end

我试过了,没用。我认为那是因为没有明确指定属性。我必须按照 rails cast 中指定的相同方式进行操作才能工作:

@@except=[:author, :id]
def attributes
    data = object.attributes.symbolize_keys
    @@except.each { |e| data.delete e  }
    data
end

在 ActiveModelSerializers 的 0.10.x 版本中,attributes 默认接收两个参数。我添加了 *args 以避免异常:

class GroupSerializer < ActiveModel::Serializer
  def attributes(*args)
    object.attributes.symbolize_keys
  end
end

我想要获取所有属性以及更多属性。

根据上面的回答,这项工作:

class NotificationSerializer < ActiveModel::Serializer

def actor
  'asdasd'
end

def attributes(*args)
  keys = object.attributes
  keys[:actor] = actor()  # add attribute here
  keys.symbolize_keys
end

结束