2010-11-22 3 views
0

J'ai un problème dans les rails où, j'ai une relation de base à plusieurs entre deux modèles (ordre et statut). Ces modèles ressemblent à ce qui suit:"méthode indéfinie` nom 'pour nil: NilClass "lors de la création d'une nouvelle instance

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

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

et

class Status < ActiveRecord::Base 
    has_and_belongs_to_many :orders 

end 

Dans mon avis d'index pour les commandes, je suis afficher l'état le plus récent de l'Ordre, si order.statuses.last.name, cependant, Lorsque je crée un nouvel ordre, je reçois une erreur. Cette erreur concerne un nom de méthode indéfini, car les nouvelles commandes n'ont aucune relation lors de leur création.

Ma question est, est-il un moyen d'initialiser une relation entre mes deux modèles, avant d'enregistrer une nouvelle commande? Je voudrais que mes commandes aient toujours au moins le premier statut dans ma collection de statuts, mais je ne veux pas avoir à le vérifier manuellement avant d'enregistrer.

L'erreur de bonnes mesures est:

undefined method `name' for nil:NilClass 

pour cette ligne à mon avis:

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

Merci à tous.

+0

Eh bien, afin d'initialiser le 'statuses' vous devez soit le coder en dur ou frapper la base de données. Alors pourquoi ne pas simplement enregistrer et ensuite passer à autre chose? Sauf si vous mettez en cache le tableau de statuts et initialisez votre commande de cette façon. – Jeremy

Répondre

0

Cela devrait prendre soin s'il n'y a pas le dernier état ou le dernier statut ne porte pas de nom

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

Une solution simple:

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

Merci Mark. Jouer autour de cela, pour ma certaine situation a eu des résultats mitigés. Je suis en mesure de réussir à faire ce qui suit: <% = order.statuses.last si order.statuses%> - mais je ne peux pas faire <% = order.statuses.last.name si order.statuses%>. Je suppose que c'est parce que la méthode .name vient de mon modèle de statut, et elle ne sait toujours pas comment répondre si c'est nul. Je pense que je dois initialiser une relation avant d'enregistrer pour que cette méthode .name soit reconnue? Encore une fois, merci beaucoup, j'apprécie vraiment l'aide. – Kombo

+0

Donc un statut peut exister sans nom? Dans ce cas, vous pouvez vouloir l'inclure dans votre condition: 'order.statuses.last.name if order.statuses.last.name' –

Questions connexes