【问题标题】:Mongoid: undefined method `name' for nil:NilClass, even when it existsMongoid:nil:NilClass 的未定义方法“名称”,即使它存在
【发布时间】:2011-11-17 05:11:49
【问题描述】:

在使用 Rails 3.1 和 Mongoid 处理一对多关系时,我一直在为 nil:NilClass 定义未定义的方法“名称”,即使我确定它存在。要么这是一个愚蠢的错误,要么是 Mongoid 出了点问题。让我们详细说明:

我不断收到此错误:

NoMethodError in Leads#index

Showing /app/views/leads/index.html.haml where line #19 raised:

undefined method `heat' for nil:NilClass
Extracted source (around line #19):

16:       - @leads.each do |lead|
17:   
18:         %tr
19:  %td #{lead.visit.heat}°
20:  %td
21:    = link_to lead.name, :controller => "leads", :action => "show", :id => lead.id

当我尝试在控制台中重现它时,它似乎工作得很好。真是令人难以置信..

以下是相关地方的代码:

-------------------------*SCHNIP*------------------------------------
class Company
  include Mongoid::Document
  include Mongoid::Timestamps

  field :name, type: String

  has_one :visit

  def self.get_companies
    visits = Visit.get_visits

    companies = self.all
    visits.each do |visit|

      unless companies.name.include?(visit.name)
        new_company = self.new 

        new_company.name = visit.name        
        new_company.visit = visit
        new_company.save
      end
    end

    #return companies for current instance
    return Company.where(:visit.exists => true)
  end
end

-------------------------*SCHNIP*------------------------------------

class Visit
  include Mongoid::Document
  include Mongoid::Timestamps

  field :heat, type: Integer
  field :name, type: String

  belongs_to :company


  def self.get_visits
    return self.all
  end

end

-------------------------*SCHNIP*------------------------------------

class LeadsController < ApplicationController
  def index
    @selected = 'visitors'
    @leads = Company.get_companies
  end
end

-------------------------*SCHNIP*------------------------------------

app/views/leads/index.html.haml

- @leads.each do |lead|

  %tr
    %td #{lead.visit.heat}°
    %td
      = link_to lead.name, :controller => "leads", :action => "show", :id => lead.id

-------------------------*SCHNIP*------------------------------------

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid associations database-relations


    【解决方案1】:

    不是你问题的答案,而是你为什么有:

      def self.get_visits
        return self.all
      end
    

    在您的 Visit 模型中,这与调用 Visit.all 不同吗?

    当您调用lead.name 时,lead 是 nilclass,它不是我猜您期望的公司。

    对于您要实现的目标而言,这一切似乎有点奇怪,而且代码太多了。

    我会回到基础。

    【讨论】:

      【解决方案2】:

      您提供的错误消息实际上表明有问题的潜在客户在某处有 Null Lead.visit。您有一个已定义的“潜在客户”,但未定义其“访问”。

      您确定可以像在 :visit.exists 中那样使用 .exists 吗?您似乎收到了一些实际上没有该访问字段的潜在客户。

      要检查,您可以尝试类似

      - @leads.each do |lead|
          - if lead.visit
              %tr
                  %td #{lead.visit.heat}°
                  %td
                      = link_to lead.name, :controller => "leads", :action => "show", :id => lead.id
      

      请检查这是否有效。

      【讨论】:

        【解决方案3】:

        我刚刚遇到这个,我有一个帐户 -> 交易关系。

        我将交易嵌入到帐户中,这阻止了我自己进行交易。我收到了同样的错误信息。

        但如果我这样做:

        a = Account.create
        a.transactions.create
        

        然后一切都很顺利。希望这有助于解释一些事情。

        【讨论】:

          猜你喜欢
          • 2014-01-25
          • 1970-01-01
          • 1970-01-01
          • 2022-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          相关资源
          最近更新 更多