2011-05-20 54 views
0

我在rails 3項目的lib目錄中有一個名爲slot.rb的文件。它創建一個名爲SojournerSupport的模塊,幷包含一個名爲Slot的類。我有以下我的config/application.rb中的文件:將模塊加載到Heroku的lib目錄中

config.autoload_paths += %W(#{config.root}/lib) 

我然後在模型中包含的模塊,我需要它,像這樣:

include SojournerSupport 

這個本地工作罰款我的機器上,但當試圖在heroku中運行應用程序時,它會顯示「未初始化的常量ShipRecord :: SojournerSupport(NameError)」ShipRecord是我包含該模塊的模型的名稱。

任何想法或建議?

回答

0

與其說是解決方案,以此來獲得更多的信息,但你有沒有試圖從本機上運行與您的生產配置的導軌(使用rails s production)?

如果您遇到同樣的問題,我會調查您的production.rb文件,以查看它是否對自動加載路徑做了任何奇怪的事情。

您也可以將控制檯加載到您的生產環境(或heroku控制檯),並調查您的Application.config以確保加載路徑符合您的預期。

最後,當我看到不一致的Heroku/dev行爲時,我首先檢查的一件事是確保我使用的是匹配的ruby版本。 Heroku仍然是或最近使用1.8.7作爲默認值。

+0

快速提示,它是'rails s -e production' – ecoologic 2013-03-08 05:32:23

0

如果SojounerSupport是頂級類或模塊,那麼在包含它時可能需要明確說明它是如此。

include ::SojournerSupport 
+0

感謝您的建議,但仍然沒有去。運行我的測試時也碰到這個問題。 – agmcleod 2011-05-20 22:01:49

0

實際上設法找出解決方案。我不知道爲什麼heroku在索引頁面崩潰,但是當我點擊一個控制器,該控制器利用模塊拉入庫模塊時,它也會給我錯誤。看起來,config.autoload_paths預計文件名與模塊名稱相同(如此處所述:Rails 3 library not loading until require)。我重命名lib目錄中的文件名,現在它在本地工作。當我回到家時,我會推送到heroku,但我認爲這解決了問題:)。

2

我有一個類似的問題,讓我的模塊在Heroku上運行。除了自動加載命名約定之外,由於Heroku上Rails生產環境的線索安全假設(即使它在我的production.rb文件中被註釋掉),我發現必須要求模塊代碼。只要在模塊上調用「include」之前,我「需要」模塊文件,一切都開始工作。

請看看在得到模塊在Heroku的正確加載的主題這個優秀的文章:

http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/

+0

這很有趣。我已經知道要求你的lib文件通常是一個壞主意,並且像我上面所說的那樣使用配置。在瀏覽鏈接的文章之後,聽起來好像是遵循命名約定,或者像您那樣手動要求它。 – agmcleod 2011-09-06 11:42:27

+0

我先試了一下,但不幸的是命名約定不適用於我 - 只要我推到Heroku,事情就會崩潰。從來沒有真正明白爲什麼,但「需要」保存了一天。你能告訴我爲什麼需要lib文件是一個壞主意嗎?有什麼東西潛伏在那裏,我會遇到這種方法? – 2011-09-07 05:41:34

+0

是的,有一個原因:http://stackoverflow.com/questions/3356742/best-way-to-load-module-class-from-lib-folder-in-rails-3。如果您閱讀下面的建議使用require的答案,它說需要文件防止ActiveSupport :: Dependencies卸載代碼。 – agmcleod 2011-09-07 11:31:56

相關問題