2008-09-18 19 views
21

我發現這個問題出現在很多不同的環境中,並希望得到在StackOverflow上修復/調試它的最佳實踐。如何在Rails中修復/調試'預期的x.rb來定義X.rb'

要使用現實世界的例子本今天上午發生在我身上:

expected announcement.rb to define Announcement 

類的開發工作正常,從生產控制檯測試,但在生產雜種失敗。下面是類:

class Announcement < ActiveRecord::Base 
    has_attachment :content_type => 'audio/mp3', :storage => :s3 
end 

我會在回答喜歡討論與其說是解決這一特定問題的問題,而是如何正確調試得到的Rails給你一個有意義的錯誤預期x.rb定義X.rb」往往是一個紅鯡魚...

編輯(3個偉大的反應來看,每瓦特/部分解決

調試:

  1. 來自Joe Van Dyk:嘗試通過導致錯誤的環境/實例通過控制檯訪問模型(在上面的例子中:script/console production然後輸入'Announcement'。

  2. 從Otto:嘗試通過初始化設置一個最小插件集,例如:config.plugins = [:exception_notification,:ssl_requirement,:all],然後重新啓用一個。

具體原因:

  1. 從伊恩·特雷爾:如果你使用attachment_fu確保你安裝了正確的圖像處理器。即使您沒有附加圖像,attachment_fu也會要求它。

  2. 從Otto:確保您沒有命名與內置Rails類衝突的模型,例如:Request。

  3. 來自Josh Lewis:確保您的應用程序(或Gem列表)中某處沒有重複的類或模塊名稱。

+0

我一直在生產耙子任務有同樣的問題。以下是我找到的最佳解決方案:http://www.spacevatican.org/2008/12/28/when-cache_classes-gets-you-down/ – user1902430 2012-12-13 22:06:22

回答

11

這是一個棘手的問題。

通常爲我工作什麼是運行「腳本/控制檯生產」的生產服務器上,並鍵入:

Announcement

這將通常給你一個更好的錯誤消息。但你說你已經試過了?

+0

良好的開端,值得投票。但是,您如何調試錯誤只發生在Mongrel上的情況? – 2008-09-18 17:01:12

+0

我使用無插件,並且在開發模式下出現此錯誤。 – jesper 2010-11-01 12:34:29

2

我以前遇到過這個問題,而AttachmentFu插件是怪罪。我相信在我的情況下,這是由於AttachmentFu期望使用不同的圖像處理器,或者也安裝了不支持的版本。當我明確地將:with => :rmagick(或類似的 - 我正在使用RMagick)添加到has_attachment方法調用時,問題就解決了,即使對於非圖像附件。顯然,請確保您的生產環境具有所有正確的寶石(或將它們凍結到您的應用程序中)以及安裝的支持軟件(ImageMagick)。因人而異。

至於沒有讓Rails和AttachmentFu吸收和隱藏真正的錯誤 - 我們在完全弄清楚之前修復它。

1

您可以嘗試禁用所有插件並將它們逐個添加回來。

在Initalizer部分environment.rb,增加一行像這樣的:

config.plugins = [ :exception_notification, :ssl_requirement, :all ] 

開始用最小的設置來運行應用程序,並通過一個添加它們於一體。當我定義了一個恰好映射到現有文件名的模型時,我通常會遇到這個錯誤。例如,一個Request模型但Rails已經有了一個request.rb,它首先被加載。

1

我有這個問題了一會兒,在我的情況下,錯誤總是從這個S3之前的錯誤:通常一遍又一遍地創建相同的桶時,會發生

(AWS::S3::Operation Aborted) "A conflicting conditional operation is currently in progress against this resource. Please try again."

此問題。 (來源AWS Developers forum

這這樣的事實是由於我曾使用attachment_fu to創建剷鬥和我decommented含有lib/technoweenie/attachment_fu/backends/s3_backends.rb命令Bucket.create(@@bucket_name)(近於線152)的線。

一旦註釋或刪除命令Bucket.create(@@bucket_name)問題就消失了。

我希望這會有所幫助。

在我的情況
0

,我得到這個錯誤在開發控制檯,但我可以在IRB加載類

0

抱歉,這並不是一個明確的答案,但另一種方法可能在某些具體情況的工作:

我剛剛遇到了這個問題,同時使用Ruby 1.8.7和Merb 1.0.15來調試網站。似乎有問題的類(我們稱之爲SomeClass)超出了範圍,但是當some_class.rb文件被自動加載時,它所需的其他文件(some_class/base.rb等)不會被require機制加載。可能是需求中的錯誤?

如果我之前需要some_class文件,比如environment.rb的結尾,它似乎可以防止對象超出範圍。

0

我得到這個錯誤二重奏到一個控制器定義是在一個文件沒有被命名爲控制器。例如,你有一個評論模型,你可以在comment.rb文件中定義控制器而不是comments_controller.rb

2

由於這仍然是谷歌的最高結果,所以我認爲我會分享解決問題的方法:

我在lib文件夾中有一個與我的應用程序名稱完全相同的模塊。所以,我在模塊名稱中有衝突,但是我也遇到了文件夾名稱的衝突(不確定後者是否實際上有區別)。

因此,對於OP,請確保您的應用程序(或Gem列表)中某處沒有重複的類或模塊名稱。

1

在使用STI更改類名引起這對我來說:

  • 類從「EDBeneficiary」改爲「EdBeneficiary」
  • 現有記錄有「EDBeneficiary」保存在「類型」一欄,所以當Rails試圖加載它們,引發異常。

修復:運行遷移以更新'type'列中的值以匹配新的類名稱。

0

我有這個問題與rails版本1.2.3。我只能用mongrel重現問題,使用控制檯環境訪問沒有給出任何有用的信息。就我而言,我解決了使RAILS_ROOT/HTML文件夾中的雜種可寫,然後重新啓動Web服務器,因爲一些用戶報告在這裏:

http://www.ruby-forum.com/topic/77708

2

對於我來說,事業是我的類定義一個循環依賴,而這個問題只會在Rails中使用autotest展現出來。在我的情況下,我不需要循環依賴,所以我只是刪除它。

2

我剛剛遇到了這個錯誤。

簡而言之,我的lib文件夾中的rb文件不在文件夾結構中以匹配我的模塊命名約定。這導致ActiveSupport自動加載器使用錯誤的模塊來查看我的類常量是否已定義。

具體地說我已經定義了以下類

module Foo 
    class Bar 
    end 
end 

在/lib/bar.rb

的根這引起了自動加載機詢問模塊對象,如果酒吧被定義,而不是模塊的Foo。

將我的rb文件移動到/lib/foo/bar.rb中解決了這個問題。

0

當我從我的應用程序的1.1.6升級到1.2.6和2.0.5時,我遇到了這個錯誤。總之,老插件導致了這個錯誤。這些插件已經過時並且沒有更新(甚至沒有回購!)。我刪除它們後,該應用程序工作在1.2.6和2.0.5。但我沒有檢查插件的詳細源代碼。

相關問題