2012-07-13 32 views
7

我有一些不適合模型或控制器盒子的Rails代碼。根據this answer,我創建了一個app/classes目錄。 Rails 3似乎自動將此添加到Rails中的「加載路徑」,我的應用程序正確地找到我在那裏定義的類,而無需使用require語句。Rails 3.2.x:如何在開發過程中重新加載app/classes目錄?

但是app/classes中的代碼沒有在開發模式下重新加載;如果我進行了更改,我需要重新啓動服務器才能看到更改。

在Rails 3.2.x中製作給定目錄「可重載」的正確方法是什麼?一些答案在這裏建議這樣做:

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

,但我相信,這僅僅是具有將app/classes最初設定的目錄中找到的代碼的效果;似乎並沒有使它們可以爲每個請求重新加載(而且在3.x中似乎自動添加了app/*)。

更新

圖,我偶然發現瞭解決方案張貼問題後僅30秒時:

我有我的包裹類的模塊內。一旦我刪除了周圍的「MyModule」,它突然變得可重新加載。來自Java背景,被Ruby代碼燒燬,污染了全局命名空間,我養成了將所有內容放在模塊中的習慣。我猜Rails的「應用程序」代碼必須活在任何模塊之外?

+3

嘗試在'classes'下創建一個子目錄,其中包含您的模塊名稱,然後將所有模塊的類放入其中。我懷疑如果一個名爲'bar.rb'的文件改變了,只有在使用類Bar時纔會重載,但如果全名實際上是Foo :: Bar則不會重載 - 那麼它會查找一個名爲'foo/bar.rb'重新加載。只是猜測,但。 – Thilo 2012-07-13 14:18:51

回答

2

您是將模塊聲明在單獨的文件中,還是將它隱式地聲明在類中?這可能會影響自動加載行爲。 module Foo; class Barclass Foo::Bar。這可能是,如果Rails自動加載器找不到要使用Foo模塊的foo.rb,它可能會跳過重新加載它。

+0

模塊在相同的文件中被聲明爲:Module Foo;類Bar,然後在整個代碼中稱爲Foo :: Bar。 – 2012-07-14 15:02:25

+0

這可能是值得嘗試擁有一個單獨的模塊文件,所以類/模塊和文件之間存在1:1關聯。 – tadman 2012-07-15 02:47:32

相關問題