Rails ActiveModel 序列化程序呈现非空属性
Posted
技术标签:
【中文标题】Rails ActiveModel 序列化程序呈现非空属性【英文标题】:Rails ActiveModel Serializers render not null attributes 【发布时间】:2015-01-25 20:47:01 【问题描述】:我想使用呈现非空属性的序列化程序
class PersonSerializer < ActiveModel::Serializer
attributes :id, :name, :phone, :address, :email
end
这可能吗?
非常感谢。
解决方案:
class PersonSerializer < ActiveModel::Serializer
attributes :id, :name, :phone, :address, :email
def attributes
hash = super
hash.each |key, value|
if value.nil?
hash.delete(key)
end
hash
end
end
【问题讨论】:
请告诉我们你到目前为止尝试了什么? 请不要通过编辑您的问题来发布答案。你应该像其他人一样post an answer。请更正这一点。 【参考方案1】:从active_model_serializer
gem 的0.10.x 版本开始,您必须重写方法serializable_hash
而不是attributes
:
# place this method inside NullAttributesRemover or directly inside serializer class
def serializable_hash(adapter_options = nil, options = , adapter_instance = self.class.serialization_adapter_instance)
hash = super
hash.each |key, value| hash.delete(key) if value.nil?
hash
end
【讨论】:
谢谢!使用 AMS 10.0.6【参考方案2】:感谢 Nabila Hamdaoui 提供的解决方案。 我通过模块使它更具可重用性。
null_attribute_remover.rb
module NullAttributesRemover
def attributes
hash = super
hash.each do |key, value|
if value.nil?
hash.delete(key)
end
end
hash
end
end
用法:
swimlane_serializer.rb
class SwimlaneSerializer < ActiveModel::Serializer
include NullAttributesRemover
attributes :id, :name, :wipMaxLimit
end
【讨论】:
我这样写的:super.keep_if |_, value| value.present?
甚至更短:super.compact
@kirushik 这绝对是最好的方法。然后代码变为:module NullAttributesRemover def attributes(*args) super.compact end end
谢谢!这正是我需要的。使用 AMD 10.0.6(包括下面的 Andrea Salicetti 建议)。【参考方案3】:
class ActiveModel::Serializer
def attributes
filter(self.class._attributes.dup).each_with_object() do |name, hash|
val = send(name)
hash[name] = val unless val.nil?
end
end
end
【讨论】:
【参考方案4】:请在您的 Person 模型中为 (:id, :name, :phone, :address, :email) 属性添加验证存在:true,这样您在渲染时将不会获得空 JSON 值。
【讨论】:
模型中存在验证的问题,属性在数据库中不会为空。这不是我想要的。 我已经添加了我找到的解决方案 是的,它会工作,但是如果属性我的意思是 key 是 nil ,它会删除,然后它不会在 JSON 中显示? 是的,这就是我想要的以上是关于Rails ActiveModel 序列化程序呈现非空属性的主要内容,如果未能解决你的问题,请参考以下文章
rails create方法ActiveModel::ForbiddenAttribute的问题
ActiveModel :: ForbiddenAttributesError使用旧版本的Ruby? [重复]
在 ActiveModel::Serializer 中序列化错误哈希
尝试运行 rspec 时,我得到“未初始化的常量 ActiveModel”