1

Rails 3.1とMongoidで1対多の関係を操作するときは、nil:NilClassの未定義のメソッド `name'が存在すると確信していても、頭をぶつけ続けます。ばかげた間違いか、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

あなたが提示したエラーメッセージは、実際には、問題のリードに 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 に答える
0

あなたの質問への答えではありませんが、なぜあなたは持っているのですか:

  def self.get_visits
    return self.all
  end

あなたの Visit モデルでは、これは Visit.all の呼び出しと同じではありませんか?

あなたがlead.nameを呼ぶとき、リードはnilclassです。あなたが期待しているように、それは会社ではありません。

それはすべて少し奇妙で、達成しようとしているコードが多すぎます。

基本に戻ります。

于 2011-09-14T20:23:58.580 に答える