Mongoid: неопределенный метод `name 'для nil: NilClass, даже если он существует - PullRequest
1 голос
/ 14 сентября 2011

Работая с отношениями один-ко-многим в 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 ]

1 голос
/ 20 ноября 2011

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

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

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

a = Account.create
a.transactions.create

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

0 голосов
/ 15 сентября 2011

Сообщение об ошибке, которое вы представили, фактически указывает на то, что рассматриваемый запрос где-то имеет нулевое лидерство. У вас есть определенное "лидерство", но его "посещение" не было определено.

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

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

0 голосов
/ 15 сентября 2011

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

  def self.get_visits
    return self.all
  end

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

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

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

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

...