当使用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*------------------------------------
答案 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
请检查一下是否有效。