2

所以我看到這個奇怪的錯誤,當我嘗試做一個相當簡單的交互式測試我添加的關聯。這裏有兩種型號:測試協會撬奇怪的錯誤

class Lot < ActiveRecord::Base 
    has_many :graves 
    belongs_to :block 
end 

class Grave < ActiveRecord::Base 
    belongs_to :lot 
end 

下面是創建表的遷移:

class CreateGraves < ActiveRecord::Migration 
    def change 
    create_table :graves do |t| 
     t.integer :grave_number 
     t.integer :lot_id 

     t.timestamps null: false 
    end 
    end 
end 

class CreateLots < ActiveRecord::Migration 
    def change 
    create_table :lots do |t| 
     t.integer :lot_number 
     t.integer :map_type 

     t.timestamps null: false 
    end 
    end 
end 

我調用撬帶:

pry -r ./config/environment.rb 

然後在撬會議上,我簡單地做:

lot = Lot.new 
l.graves 

我得到這個錯誤:

NameError: uninitialized constant Lot::Grafe 
from /.../activerecord-4.2.6/lib/active_record/inheritance.rb:158:in `compute_type' 

...有簡單的路徑,我的rbenv安裝和紅寶石2.3.0子目錄鏈。我在那裏替換它以保持輸出可讀。

我還有其他類定義了其他類似的關聯,所有這些都按預期工作。

+1

改變從'類名後的默認行爲墳墓'到'Gravesite'照顧這個。我不知道系統中的什麼寶石會干擾Grave類的名稱,但是無論它是哪一個,它都是一個巨大而嘈雜的WTF。 – jaydel

回答

2

這是Rails入侵者的問題。它發生在奇怪的時代,是一個奇怪的Rails怪癖。

2.3.1 :004 > a = "Grave" 
=> "Grave" 
2.3.1 :005 > a.pluralize 
=> "Graves" 
2.3.1 :006 > a = "graves" 
=> "graves" 
2.3.1 :007 > a.singularize 
=> "grafe" 

您可以覆蓋在經常被忽略的./config/inflections.rb文件:

ActiveSupport::Inflector.inflections(:en) do |inflect| 
    inflect.irregular 'grave', 'graves' 
end 

變化

2.3.1 :001 > a = "grave" 
=> "grave" 
2.3.1 :002 > a.pluralize 
=> "graves" 
2.3.1 :003 > a = "graves" 
=> "graves" 
2.3.1 :004 > a.singularize 
=> "grave" 
+0

哇,我想我只需要在「我永遠不會知道」下永久地提交這個文件。它不會讓我獎勵18個小時的獎金,但你會得到它。非常感謝。 – jaydel

+1

是的線索是在錯誤消息「NameError:未初始化的常量Lot :: Grafe」< - 注意常量Grafe而不是Grave。 :) – engineerDave

+0

所以我發現了一個隨機的網站,顯示了各種方式來結合古英語動詞'格拉凡'這意味着'挖,挖起來; 墳墓;雕刻,鑿子,刻'。其中一個變化確實是「grafe」。 – jaydel