Rails - 在表循环中访问一个到多个变量

时间:2012-05-22 09:10:17

标签: ruby-on-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

从我的tasks / show.html.erb视图

<%= @task.priority.name %>

这很有效。

但是在我的tasks / 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 个答案:

答案 0 :(得分:3)

我猜你的NoMethodError来自nil:NilClass。尝试:

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

答案 1 :(得分:0)

您确定已经在数据库中创建了主键的所有模型和链接吗?我认为您链接到具有优先级ID(prority_id)的任务,该任务不存在。

检查您的数据。

答案 2 :(得分:0)

鉴于任务中没有确认优先级的存在,很可能你在nil上调用“name”。克里斯托夫说,在打印之前验证优先级的存在(使用validates_presence_of)或检查它是否存在。