2015-09-04 75 views
0

今天早些時候,我有這個問題,當我運行模塊和類與Rails項目同名

sidekiq 

我收到以下錯誤:

I, [2015-09-04T12:43:33.723243 #15197] INFO -- : Celluloid 0.17.1.2 is running in BACKPORTED mode. [ http://git.io/vJf3J ] 
Report is not a class 
/home/andreydeineko/employees/app/models/report.rb:1:in `<top (required)>' 

Report是AR類/模型沒有任何錯別字。

它發生的錯誤是由於這樣的事實,即該項目有一個叫Report先前定義的模塊。

爲什麼這個問題,相同的類和模塊名稱發生?

是否有任何Ruby/Rails約定不命名類和模塊同名?

+0

*「之前定義了一個名爲Report的模塊。」* - 這是什麼意思?新老代碼是否有不同的流程? – Stefan

+0

不在我運行sidekiq的那一刻。我不知道該項目有一個名爲「報告」的模塊(即使我知道我仍然會將我的班級命名爲「報告」,因爲我不知道這會導致問題)。當我定義的類「報告」與模塊「Report」無關時,sidekiq抱怨報告不是類。 –

回答

2

你不能爲ClassModule重複使用相同的名稱。在內部,在Ruby中,模塊表示爲類結構,因此它們共享相同的對象空間。

此外,當你定義一個模塊/類,可以訪問的名稱爲常數。

class Report 
    def foo 
    p "report" 
    end 
end 

Report 
=> Report 

defined? Report 
=> "constant" 

其實,你也可以寫

Report = Class.new do 
    def foo 
    p "report" 
    end 
end 

report = Report.new 
report.foo 

長話短說,如果定義爲ReportClass,你不能使用相同的名稱創建一個Module

+0

常量可以 - 當然只能引用單個對象,但從技術上講,您可以使用相同的['name'](http://ruby-doc.org/core-2.2.3/Module)創建多個類/模塊。 html#method-i-name),這只是一個屬性。 – Stefan

+0

所以我想這 **「在內部,在Ruby模塊中表示爲類結構,因此它們共享相同的對象空間。」**是主要觀點,對吧?但是Rails在調用常量時使用了什麼順序?通過我的例子,Rails識別出了涉及模塊的「報告」常量(並且不關心類'報告') - 模塊總是首先在這個鏈中? –

+0

它只是取決於哪個文件首先被加載。 –

1

Is there any Ruby/Rails convention to not name the class and module with same name?

class關鍵字做兩件事情 - 它可以創建一個新的類,並將其分配給定的常量或重新打開它基於給定不變的現有類。 (同樣用於module

在後一種情況下,它也將如果常數不是預期類引發錯誤。不管它是模塊還是其他對象:

Report = 123 

class Report 
end 
#=> TypeError: Report is not a class 
+0

這不能回答我的問題,因爲我的應用程序中有一個「報告」類,它仍然會引發錯誤。 –

+0

@AndreyDeineko一個'TypeError'指示'Report'常量已經被定義,並且它不是一個類,就像在我的例子中一樣。 – Stefan

+0

但在控制檯操縱模塊和類的作品。 Rails在調用常量時使用什麼順序?模塊第一? –