2013-09-05 15 views
8

Il mio modello rubino, in questo modo:Rubino uscita id del modello come oggetto oid

class User 
    include Mongoid::Document 
    field :first_name, type: String 
    field :birthdate, type: Date 

    validates :first_name, :birthdate, :presence => true 

end 

emette un oggetto in questo modo:.

{ 
_id: { 
$oid: "522884c6c4b4ae5c76000001" 
}, 
birthdate: null, 
first_name: null, 
} 

Il mio progetto spina dorsale non ha idea di come gestire _id $ OID .

Ho trovato questo articolo e il codice:

https://github.com/rails-api/active_model_serializers/pull/355/files

module Moped 
    module BSON 
    class ObjectId 
     alias :to_json :to_s 
    end 
    end 
end 

Non ho idea di dove mettere questo, e come invocarlo sull'uscita del modello, così ho cercato dentro:

/config/initializers/secret_token.rb

Sono nuovo a Ruby e Rails e non ho idea di come procedere, quindi qualsiasi aiuto è molto apprezzato

+1

Che 'ciclomotore :: :: BSON ObjectId' cerotto scimmia può essere posizionato ovunque (un inizializzatore suona come un buon posto , anche se dovresti creare un nuovo inizializzatore solo per questo codice) e dovrebbe funzionare. Dopo averlo aggiunto e riavviato il server delle guide, ha funzionato? Cosa è successo invece di quello che ti aspettavi? –

+0

Per favore, se usi il sintassi costrutto 'alias', quindi usalo correttamente:' alias to_json to_s'. Se vuoi usare un metodo in cui devi effettivamente passare i simboli, usa alias_method: 'alias_method: to_json,: to_s'. – apeiros

risposta

6

Che cosa si dovrebbe fare è inserire questo nella cartella inizializzatore, creare un file in questo modo:

/config/initializers/mongoid.rb

module Moped 
    module BSON 
    class ObjectId 
     alias :to_json :to_s 
     alias :as_json :to_s 
    end 
    end 
end 
+0

Devo definire un modo per includerlo o include automaticamente gli inizializzatori? Ho creato il file e ne esce ancora come _id. $ Oid – azz0r

+0

hi @ azz0r ho dimenticato di aggiungere l'alias anche nel metodo as_json. Prova questo codice. Informazioni sulla cartella di inizializzazione, i binari attraversano tutti i file all'interno di config/inizializzatori /. e gestirli tutti. –

+0

Incredibile, grazie – azz0r

3

risposta di Aurthur lavorato per tutto tranne Rabl. Se stai usando rabl gli attributi: id genererà un'eccezione. Il seguente codice sarà compatibile con rabl.

module Moped 
    module BSON 
    class ObjectId 
     def to_json(*args) 
     to_s.to_json 
     end 

     def as_json(*args) 
     to_s.as_json 
     end 
    end 
    end 
end 

Per ulteriori informazioni, vedere la questione github https://github.com/nesquena/rabl/issues/337

28

iterazione su risposta di Kirk:

In Mongoid 4 implementazione BSON del ciclomotore è stato rimosso in favore del BSON gemma MongoDB, in modo che il corretto versione per Mongoid 4 utenti è:

module BSON 
    class ObjectId 
    def to_json(*args) 
     to_s.to_json 
    end 

    def as_json(*args) 
     to_s.as_json 
    end 
    end 
end 
+0

Questa risposta ha funzionato per me, su Rails (4.1.4) ciclomotore (2.0.0) – Alex

+0

thx. questo ha funzionato per me.rails 4.0 – kidcapital

+0

Anche questo ha funzionato, non dimenticarti di riavviare il tuo server e resettare il caching se le tue API sono memorizzate nella cache (dovevi capirlo nel modo più duro) ... – Dean

0

Ecco una risposta migliore

0.123.
require "bson" 

class Jbuilder < JbuilderProxy 

    def _extract_method_values(object, *attributes) 
    attributes.each do |key| 
     value = object.public_send(key) 

     if value.is_a? ::BSON::ObjectId 
     value = value.to_s 
     end 

     _set_value key, value 
    end 
    end 
end 
3

Per i ragazzi che utilizzano Mongoid 4+ utilizzare questo,

module BSON 
    class ObjectId 
    alias :to_json :to_s 
    alias :as_json :to_s 
    end 
end 

Reference