Mongoid: неопределенное имя метода для nil:NilClass, даже если оно существует

При работе с отношениями «один ко многим» в Rails 3.1 и Mongoid я продолжаю сталкиваться с неопределенным методом «имя» для nil:NilClass, даже если я уверен, что он существует. Либо это глупая ошибка, либо с монгоидом что-то не так. Давайте уточним:

Я продолжаю получать эту ошибку:

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*------------------------------------

person Herbert    schedule 14.09.2011    source источник


Ответы (3)


Я только что столкнулся с этим, у меня была связь «Учетная запись -> Транзакция».

Я внедрил Транзакции в Аккаунт, что затем помешало мне совершать Транзакции самостоятельно. Я получил такое же сообщение об ошибке.

Но если бы я сделал это:

a = Account.create
a.transactions.create

Потом все пошло нормально. Надеюсь, это поможет что-то объяснить.

person stuartc    schedule 20.11.2011

Не ответ на ваш вопрос, но почему у вас есть:

  def self.get_visits
    return self.all
  end

В вашей модели Visit это не то же самое, что вызвать Visit.all ?

Когда вы звоните в lead.name, лид имеет нулевой класс, это не компания, как я думаю, вы этого ожидаете.

Все это кажется немного странным и слишком много кода для того, чего вы пытаетесь достичь.

Я бы вернулся к основам.

person nodrog    schedule 14.09.2011

Сообщение об ошибке, которое вы представили, на самом деле предполагает, что у интереса, о котором идет речь, где-то есть Null lead.visit. У вас есть определенный «лид», но его «посещение» не определено.

Вы уверены, что можете использовать .exists как в :visit.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

Пожалуйста, проверьте, работает ли это.

person FernandoH    schedule 14.09.2011