如何使用 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
结束
我有一个简单的问题。我有一个看起来像这样的序列化器:
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
结束