2011-01-17 4 views
0

У меня есть приложение для рельсов, и я хотел бы сделать что-то вроде task.labels.first.label_name, чтобы получить имя метки задачи. Тем не менее, я получаю undefined method label_name. Я сделал t = Task.first; t.labels.first.label_name в консоли, и это сработало, поэтому я не уверен, что происходит. Вот модели, то места расположения ошибки:Доступ к атрибутам во многих-ко-многим

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 

Ошибка в индексе

<% 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 %> 

ответ

1

Мое предположение было бы, что одна из задач в @tasks не имеет метки так, когда вы вызов task.labels.first возвращает nil, а затем вы пытаетесь вызвать label_name для nil, который, конечно, не работает.

Самым простым решением было бы сделать проверку, как это:

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

Теперь это не выглядит так хорошо с точки зрения, так что вы можете поместить этот чек в модели Task вместо этого, может быть, как это :

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 

И в представлении:

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

И другое дело, только в случае, если ш ould, чтобы просмотреть все связанные ярлыки, вы можете сделать что-то вроде этого:

task.labels.map(&:label_name).join(", ") 
Смежные вопросы