1

在使用 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*------------------------------------
4

3 回答 3

1

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

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

但如果我这样做:

a = Account.create
a.transactions.create

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

于 2011-11-20T13:00:37.613 回答
0

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

  def self.get_visits
    return self.all
  end

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

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

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

我会回到基础。

于 2011-09-14T20:23:58.580 回答
0

您提供的错误消息实际上表明有问题的潜在客户在某处有 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

请检查这是否有效。

于 2011-09-14T20:41:23.360 回答