簡體   English   中英

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>

確切的錯誤是“ nil:NilClass的未定義方法'id'”。

我的聯系不正確嗎?

您的數據庫中有一個未鏈接到某人的任務。 這意味着您的數據庫當前:

  1. 允許tasks.person_idnull
  2. tasks.person_id上沒有對people表的foreign_key
  3. 1和2的組合

有關外部鍵的信息,請參見Rails遷移指南。

解:

  • 查找沒有人的任務: Task.includes(:person).all.select { |t| t.person.nil? } Task.includes(:person).all.select { |t| t.person.nil? } Task.includes(:person).all.select { |t| t.person.nil? } ,刪除這些任務或為他們分配一個現有人員
  • 添加一個修復數據庫的遷移,確保person_id是外鍵並且不能為空。

(如果您有很多任務,則可以用LEFT JOIN SQL查詢代替第一點,我認為情況並非如此)。

在我看來,關聯正確。 如果不是,則您的錯誤消息將抱怨沒有名為person方法的task

相反,該消息告訴您t.person實際上為nil 我假設@task實際上是一些任務集合; 其中至少有一個似乎想念一個人。

如果您認為每個任務都一定要有一個人,那么可以使用Rails控制台或數據庫的GUI查看我的數據。 另外,使用安全訪問運算符t&.person&.id可以避免此錯誤,並向您顯示發生了什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM