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"。
我的联想不正确吗?
您的数据库中有一项任务未链接到某个人。这意味着您的数据库当前:
- 允许
tasks.person_id
为 null
。
- 在
tasks.person_id
上没有 foreign_key 到 people
table
- 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
这将避免此错误并向您展示正在发生的事情。
我的模型如下:
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"。
我的联想不正确吗?
您的数据库中有一项任务未链接到某个人。这意味着您的数据库当前:
- 允许
tasks.person_id
为null
。 - 在
tasks.person_id
上没有 foreign_key 到 - 1 和 2 的组合
people
table
请参阅 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
这将避免此错误并向您展示正在发生的事情。