2011-01-17 12 views
0

Ich habe eine Rails App und ich möchte in der Lage sein, etwas wie zu tun, um den Labelnamen einer Aufgabe zu erhalten. Ich bekomme jedoch eine undefined method label_name. Ich habe eine t = Task.first; t.labels.first.label_name in der Konsole, und das hat funktioniert, also bin ich mir nicht sicher, was los ist. Hier sind die Modelle dann die Orte des Fehlers:Zugreifen auf Attribute in einem Many-to-Many

class Categorization < ActiveRecord::Base 
belongs_to :label 
belongs_to :task 
end 

class Label < ActiveRecord::Base 
    attr_accessible :label_name 

    has_many :categorizations 
    has_many :tasks, :through => :categorizations 
end 

class Task < ActiveRecord::Base 
    attr_accessible :task 

    has_many :categorizations 
    has_many :labels, :through => :categorizations 
end 

Der Fehler ist im Index

<% for task in @tasks %> 
<tr> 
    <td><%= task.task %></td> 
    <td><%= task.labels.first.label_name %></td> 
    <td><%= link_to "Show", task %></td> 
    <td><%= link_to "Edit", edit_task_path(task) %></td> 
    <td><%= link_to "Destroy", task, :confirm => 'Are you sure?', :method => :delete %></td> 
</tr> 
<% end %> 

Antwort

1

Meine Vermutung wäre, dass eine der Aufgaben in @tasks keine Etiketten so hat, wenn Sie Rufen Sie task.labels.first auf, es gibt nil zurück und dann versuchen Sie label_name für nil aufzurufen, was natürlich nicht funktioniert.

wäre die einfachste Lösung, einen Scheck wie dies zu tun:

<td><%= task.labels.first.label_name unless task.labels.first.nil? %></td> 

, dass jetzt nicht in der Ansicht so gut aussehen, so dass Sie, dass der Check in Ihrem Task-Modell wie dies vielleicht stattdessen platzieren möchten, :

class Task < ActiveRecord::Base 
    attr_accessible :task 

    has_many :categorizations 
    has_many :labels, :through => :categorizations 

    def label_name 
    self.labels.first.label_name unless self.labels.first.nil? 
    end 
end 

Und in der Ansicht:

<td><%= task.label_name %></td> 

Und noch etwas, nur für den Fall Sie w Möchten Sie alle zugehörigen Beschriftungen anzeigen, können Sie beispielsweise Folgendes tun:

task.labels.map(&:label_name).join(", ") 
Verwandte Themen