Mongoid:nil的未定义方法`name':NilClass,即使它存在

时间:2011-09-14 16:56:11

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

当使用Rails 3.1和Mongoid处理一对多关系时,我一直在讨论未定义的方法`name'为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*------------------------------------

3 个答案:

答案 0 :(得分:1)

我刚碰到这个,我有一个帐户 - &gt;交易关系。

我将交易嵌入账户,这使我无法自行进行交易。我收到了同样的错误消息。

但如果我这样做了:

a = Account.create
a.transactions.create

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

答案 1 :(得分:0)

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

  def self.get_visits
    return self.all
  end

在您的访问模式中,这与调用Visit.all不一样吗?

当你打电话给lead.name时,领导是nilclass,它不是公司,因为我猜你期待它。

对于你想要实现的目标,这一切看起来都有点奇怪而且远远不够。

我会回到基础。

答案 2 :(得分: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

请检查一下是否有效。