Rails:NoMethodError 未定义错误是否链接到 belongs_to?

Rails: Is the NoMethodError undefined error linked to belongs_to?

我的模型如下:

    class Project < ApplicationRecord
      belongs_to :workspace
      has_many :tasks, dependent: :destroy
    end

    class Task < ApplicationRecord
      belongs_to :person
      belongs_to :project
    end

    class Person < ApplicationRecord
      belongs_to :company
      has_many :tasks
    end

如您所见,每个任务都属于一个项目。除此之外,每个任务都有一个人与之相关(负责该任务)。在我的任务模型中,我有一个 project_id 和一个 person_id.

在我的 Tasks#Index 视图中,我收到了一个 NoMethodError。在索引视图中,这是导致错误的原因:

    <% @task.each do |t| %>
        <tr>
            <td><%= t.person.id %></td>

准确的错误是"undefined method `id' for nil:NilClass"。

我的联想不正确吗?

您的数据库中有一项任务未链接到某个人。这意味着您的数据库当前:

  1. 允许 tasks.person_idnull
  2. tasks.person_id
  3. 上没有 foreign_key 到 people table
  4. 1 和 2 的组合

请参阅 Rails 有关外键的迁移指南 here

解决方案:

  • 找到没有人的任务:Task.includes(:person).all.select { |t| t.person.nil? },删除这些任务或分配一个现有的人给他们
  • 添加修复数据库的迁移,确保 person_id 是外键且不可为空。

(如果您有很多任务,第一点可以用 LEFT JOIN SQL 查询代替,我假设情况并非如此)。

在我看来这些联想是正确的。如果不是,您的错误消息会抱怨 task 没有调用 person 的方法。

相反,消息告诉您 t.person 实际上是 nil。我假设 @task 实际上是一些任务的集合;其中至少有一个似乎缺了一个人。

如果您认为每个任务都应该有一个人,我会使用 rails 控制台或数据库的 GUI 查看我的数据。或者,使用安全访问运算符 t&.person&.id 这将避免此错误并向您展示正在发生的事情。