2010-11-22 14 views
0

Ich habe ein Problem in Schienen, wo, ich habe eine grundlegende viele zu viele Beziehung zwischen zwei Modellen (Reihenfolge und Status). Diese Modelle wie folgt aussehen:"undefined Methode` Name 'für Nil: NilClass "beim Erstellen neuer Instanz

class Order < ActiveRecord::Base 
    has_many :products, :through => :lines 
    has_and_belongs_to_many :statuses 

    default_scope order("#{table_name}.created_at desc") 
end 

und

class Status < ActiveRecord::Base 
    has_and_belongs_to_many :orders 

end 

In meinem Indexansicht für Aufträge, ich bin die Anzeige des Ordens neuesten Stand, so order.statuses.last.name jedoch Wenn ich einen neuen Auftrag erstelle, erhalte ich einen Fehler. Dieser Fehler betrifft einen nicht definierten Methodennamen, da die neuen Aufträge bei ihrer Erstellung keine Beziehung haben.

Meine Frage ist, gibt es eine Möglichkeit, eine Beziehung zwischen meinen beiden Modellen zu initialisieren, bevor Sie eine neue Bestellung speichern? Ich möchte, dass meine Bestellungen immer den ersten Status in meiner Statussammlung haben, aber ich möchte nicht, dass ich sie vor dem Speichern manuell überprüfen muss.

Der Fehler für gute Maßnahmen ist:

undefined method `name' for nil:NilClass 

für diese Linie in meiner Sicht:

<td><%= order.statuses.last.name %></td> 

alle Danke.

+0

Nun, um die 'statuses' zu initialisieren Sie müssen entweder hart Code oder schlagen Sie die Datenbank. Warum also nicht einfach speichern und dann weitermachen? Es sei denn, Sie kopieren das Status-Array und initialisieren Ihre Bestellung auf diese Weise. – Jeremy

Antwort

0

Diese sollten darauf achten, wenn es keine letzte Status ist oder der letzte Zustand nicht über Namen

<td><%= order.statuses.last.try(:name) %></td> 
1

Eine einfache Lösung:

<td><%= order.statuses.last.name if order.statuses %></td> 
+0

Danke Mark. Um dies zu spielen, hat meine bestimmte Situation gemischte Ergebnisse gehabt. Ich bin in der Lage, erfolgreich Folgendes zu tun: <% = order.statuses.last wenn order.statuses%> - aber ich kann nicht tun <% = order.statuses.last.name if order.statuses%>. Meine Vermutung ist, dass dies daran liegt, dass die .name-Methode von meinem Statusmodell kommt und sie immer noch nicht weiß, wie sie reagieren soll, wenn dies null ist? Ich denke, ich muss eine Beziehung vor dem Speichern für diese .Name-Methode zu erkennen, um erkannt zu werden? Nochmals vielen Dank, ich schätze die Hilfe sehr. – Kombo

+0

Also kann ein Status ohne einen Namen existieren? In diesem Fall sollten Sie das in Ihrer Bedingung einschließen: 'order.statuses.last.name if order.statuses.last.name' –

Verwandte Themen