2010-03-31 5 views
5

Ich möchte den Klassennamen beim Aufruf von to_json auf einem AR-Modell ändern.Override as_json oder to_json Modell Klassenname

heißt

Book.first.to_json 
#=> "{\"book\":{\"created_at\":\"2010-03-23 

Book.first.to_json(:root => 'libro') 
#=> "{\"libro\":{\"created_at\":\"2010-03-23 

Gibt es eine Möglichkeit, dies zu tun?

+1

nur zu verwenden, ich weiß nicht, über to_json zwingende, aber Sie können Active gesetzt :: Base.include_root_in_json = false und es nicht ausgegeben der Wurzelknoten wird, könnten Sie dann hinzufügen was auch immer Wurzelknoten Sie mögen. – Corey

Antwort

0

Sie können die standardmäßige to_json-Methode in Ihrem Modell überschreiben, einen Hash der gewünschten Attribute erstellen und dann die Methode to_json des Hashs aufrufen.

class Book < ActiveRecord::Base 

    def to_json 
    { :libro => { :created_at => created_at } }.to_json 
    end 

end 

#=> "{\"libro\":{\"created_at\":\"2010-03-26T13:45:28Z\"}}" 

Oder wenn Sie alle Datensätze wollen Attribute ...

def to_json 
    { :libro => self.attributes }.to_json 
end 
28

Um mit Rails 3, außer Kraft setzen as_json statt to_json kompatibel zu sein. Es wurde in 2.3.3 eingeführt:

def as_json(options={}) 
    { :libro => { :created_at => created_at } } 
end 

Stellen Sie sicher ActiveRecord::Base.include_root_in_json = false. Wenn Sie to_json aufrufen, wird hinter den Kulissen as_json verwendet, um die Datenstruktur zu erstellen, und ActiveSupport::json.encode wird verwendet, um die Daten in eine JSON-Zeichenfolge zu codieren.

6

Seit 3.0.5 haben Sie nun die Option, eine root-Option an den to_json-Aufruf zu übergeben. Hier ist jetzt die Quelle der as_json Methode auf aktiven Datensatz.

def as_json(options = nil) 
    hash = serializable_hash(options) 

    if include_root_in_json 
     custom_root = options && options[:root] 
     hash = { custom_root || self.class.model_name.element => hash } 
    end 

    hash 
end 

Also das @obj.to_json(:root => 'custom_obj')