2012-03-28 8 views
2

Ich habe ein Modell Entree, die zu einem Modell Vin gehört, die selbst zu einem Modell Producteur gehört.Initialize Kind Modelle bei der Modellerstellung

Auf dem Formular für Entrese Erstellung/Edition, möchte ich dem Benutzer ermöglichen, die Attribute für Eltern Vin und Producteur zu definieren, um sie zu erstellen, oder abrufen, wenn sie existieren (Abruf basierend auf Benutzereingabe).

Für jetzt habe ich die folgenden in Entree new und edit Aktionen ausführen:

@entree = Entree.new 
@entree.vin = Vin.new  
@entree.vin.producteur = Producteur.new 

und fields_for Helfer in Form verwenden, und das funktioniert. Aber ich beabsichtige, viel mehr Abhängigkeiten mit mehr Modellen zu haben, also möchte ich es DRY behalten. I definierte ein after_initialize Rückruf in Vin Modell, das die Initialisierung producteur tut:

class Vin < ActiveRecord::Base 
    after_initialize :vin_setup 

    def vin_setup 
    producteur = Producteur.new 
    end 
end 

und die producteur.new von der Steuerung entfernen. Um jedoch einen Fehler auf neue Aktion erhalten:

nicht definierte Methode `model_name‘ für NilClass: Klasse

für die Linie in der Form, die

<%= fields_for @entree.vin.producteur do |producteur| %> 

sagt, ich denke, das bedeutet, dass die after_initialize Callback verhält sich nicht so, wie ich es erwarte. Gibt es etwas, das mir fehlt? Außerdem bekomme ich den gleichen Fehler, wenn ich eine after_initialize Methode im Vin-Modell definiere, anstatt einen Callback zu definieren.

Antwort

1

Sie müssen wahrscheinlich

def vin_setup 
    self.producteur = Producteur.new 
end 

Die Art und Weise haben Sie es, Sie sind eine lokale Variable Initialisierung genannt producteur.

+0

Dank, dass es funktioniert. Ich dachte, da producteur eine definierte Verbindung ist, sollte sie es erkennen. – Antoine

0

Sie können keine Rückrufmethode für das Ereignis after_initialize registrieren. Sie müssen eine Methode namens after_initialize implementieren.

Versuchen Sie folgendes:

class Vin < ActiveRecord::Base 
    def after_initialize 
    self.producteur = Producteur.new if new_record? 
    end 
end 
Verwandte Themen