1

我在任务和优先级之间建立了简单的一对多关系。

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 的魔法会过滤成这样的样子。

4

3 回答 3

3

我猜你的 NoMethodError 出现在 nil:NilClass 上。尝试:

  <%= task.priority.name if task.priority %>
于 2012-05-22T09:25:34.353 回答
0

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

检查您的数据。

于 2012-05-22T09:15:38.630 回答
0

鉴于没有验证任务中是否存在优先级,您很有可能在 nil 上调用“名称”。验证优先级的存在(使用 validates_presence_of)或在打印之前检查它是否存在,如 Christoph 所说。

于 2012-05-22T16:26:16.450 回答