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”

ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”

ActiveModel :: MissingAttributeError:抛出测试而不是控制台