2016-05-04 3 views
1

Ich habe folgende Klassen definiertnicht definierte Methode `Schlüssel für Null: NilClass beim Aufruf to_json auf beliebige Klasseninstanz

class Post 
    include ActiveModel::Serializers::JSON 

    attr_accessor :id, 
       :title, 
       :status, 
       :meta 
    def attributes 
    { 'id' => nil, 'title' => nil, 'status' => nil, 'meta' => nil } 
    end 
end 


class PostMeta 
    include ActiveModel::Serializers::JSON 

    attr_accessor :id, 
       :key, 
       :value, 
       :description 

    def attributes 
    { 'id' => nil, 'key' => nil, 'value' => nil } 
    end 
end 

Wenn ich versuche, to_json zu nennen es Fehler erwähnt ergibt. Hier ist, wie ich Setup die Daten

post = Post.new 
post.id = 1 
post.title = 'test' 
post.status = 0 

meta = PostMeta.new 
meta.id = 8 
meta.key = 'cloud' 
meta.value = 'wpengine' 

post.meta = meta 

post.to_json 

Wenn ich nicht meta in post setzen Sie dann ist es nicht den Fehler geben. Wenn ich meta mit einer aktiven Datensatzinstanz festlegen, funktioniert es auch ohne Fehler.

Kann jemand vorschlagen, was ich in den oben genannten Klassen fehlt?

Antwort

0

Ich fand es heraus.

PostMeta hat attribute_accessor für description definiert wurde aber von attributes Methode in hash zurückgegeben fehlt.

Ich refaktoriert auch ein bisschen, so muss ich mich nicht sorgen über Hinzufügen/Entfernen von Attributen zu attributes Hash, wenn attributes_accessor Liste ändert.

class Base 
    include ActiveModel::Serializers::JSON 

    def attributes 
    @attributes ||= Hash[self.class::ATTRIBUTES.map(&:to_s).zip] 
    end 
end 

class Post < Base 
    ATTRIBUTES = [:id, :title, :status, :meta] 
    attr_accessor *ATTRIBUTES 

end 


class PostMeta < Base 
    ATTRIBUTES = [:id, :key, :value, description] 
    attr_accessor *ATTRIBUTES 
end 
Verwandte Themen