2014-11-27 13 views
7

voglio usare un serializzatore che non rende nullo attributiRails ActiveModel Serializzatori non rendere nulli gli attributi

 class PersonSerializer < ActiveModel::Serializer 
     attributes :id, :name, :phone, :address, :email 
    end 

questo è possibile.

Molte grazie.

Soluzione:

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 
+0

prego ci mostra che cosa hai provato finora? –

risposta

-2

Si prega di aggiungere la presenza di convalida: vero nel modello Persona per (: id,: nome,: telefono,: indirizzo,: e-mail) attribuisce, in modo da ottenere il valore non nullo JSON mentre esegui il rendering.

+0

Il problema con la convalida presenza nel modello, l'attributo non sarà nullo nel database. Non è quello che voglio. –

+0

Ho aggiunto la soluzione che ho trovato –

+0

Sì, funzionerà, ma cosa succede se attribuisce intendo che la chiave è nulla, verrà eliminata, quindi non verrà visualizzata in JSON? –

8

Grazie Nabila Hamdaoui per la soluzione. L'ho reso un po 'più riutilizzabile tramite i moduli.

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 

Usage:

swimlane_serializer.rb

class SwimlaneSerializer < ActiveModel::Serializer 
    include NullAttributesRemover 
    attributes :id, :name, :wipMaxLimit 
end 
+2

L'ho scritto come: 'super.keep_if {| _, value | value.present? } ' – kjprice

+2

O ancora più corto:' super.compact' – kirushik

+0

@kirushik Questo è assolutamente il modo migliore. Il codice diventa quindi: 'module NullAttributesRemover attributi def (* args) super.compact fine fine' –

0
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 
11

Dalla versione 0.10.x di active_model_serializer gemma, è necessario eseguire l'override del metodo serializable_hash invece di 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 
+0

Grazie! Lavorare con AMS 10.0.6 –