這是一個棘手的解釋。我在另一個模塊命名空間的模塊,像這樣:儘管在文件中定義了文件,但無法自動從文件自動加載文件
# app/models/points/calculator.rb
module Points
module Calculator
def self.included(base)
base.send(:include, CommonMethods)
base.send(:include, "Points::Calculator::#{base}Methods".constantize)
end
end
end
所以後來在其他類中的所有我需要做的是:
class User
include Points::Calculator
end
我指定在application.rb中這個目錄是autoloadable ...(即使我認爲鐵軌遞歸通過模型...)
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ]
在開發環境,一切工作正常。當運行測試(生產ENV),我收到以下錯誤:
Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError)
其實我跟着這裏的建議來解決這個問題:在application.rb中明確要求calculator.rb Stop Rails from unloading a module in development mode。
但是,爲什麼會發生這種情況?
我在ActiveSupport的dependencies.rb文件中插入了一些調試輸出,並注意到這個文件需要兩次。它第一次需要我可以看到這個常量確實被加載了。
但是第二次它所需的常量已被卸載,據Rails所知,但當實際的請求被調用時,ruby返回false,因爲ruby知道它已經要求它。然後,Rails拋出「無法自動加載常量」錯誤,因爲常量仍然不存在,並且ruby沒有「重新請求」該文件。
任何人都可以闡明爲什麼這可能會發生?
從自動加載路徑丟失中刪除點有幫助嗎?它不應該是必需的 –
是的,我已經試過它和沒有在自動加載路徑。同樣的問題。 –
似乎有同樣的問題。非常討厭必須要求班級,因爲我有大約30多個這樣的班級。 – Kohanz