2012-05-22 24 views
1

我在任務和優先級之間有一個簡單的一對多關係。Rails - 在表循環中訪問一個到多個變量

class Task < ActiveRecord::Base 
    attr_accessible :subject, :body, :priority_id, :company_id, :status_id, :user_ids 
    has_and_belongs_to_many :users 
    belongs_to :priority 
    belongs_to :company 
    belongs_to :status 
end 


class Priority < ActiveRecord::Base 
    attr_accessible :name 
    has_many :tasks 
end 

從我的任務/ show.html.erb視圖

<%= @task.priority.name %> 

這工作。

在我的任務

然而/ index.html.erb

<% @tasks.each do |task| %> 
    <tr> 
    <td><%= task.subject %></td> 
    <td><%= task.body %></td> 
    <td><%= task.priority.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 %> 

到task.priority.name調用不起作用。

它拋出一個NoMethodError。

我猜這是一個非常愚蠢的新手錯誤,但我不能爲我的生活弄清楚。它會假定Active Record魔法會過濾成這樣的樣子。

回答

3

我想你的NoMethodError是nil:NilClass。嘗試:

<%= task.priority.name if task.priority %> 
+0

優秀的猜測Christoph!非常感謝 - 我想當你是新手時,你懷疑你的語法,不要想像這樣簡單的事情:)非常感謝 –

0

您確定您已經很好地創建了數據庫中的所有主鍵的模型和鏈接嗎?我認爲你鏈接到一個不存在的優先級ID(prority_id)的任務。

檢查您的數據。

0

鑑於沒有驗證任務中是否存在優先級,所以很有可能在nil上調用「name」。如克里斯托夫所說,驗證存在的優先級(with validates_presence_of)或在打印之前檢查它是否存在。