2012-10-21 150 views
3

我有一個像這樣的rails設置。Rails加載類更改,而無需重新啓動服務器

應用程序/服務/ TestService.rb

class TestService 

    def self.doSomething 
    return 'Hello World!' 
    end 

end 

我使用控制器上的這個文件。

require 'TestService' 

class IndexController < ApplicationController 

    def index 
    @message = TestService.doSomething 
    end 

end 

我還在config文件夾中的application.rb中添加了這個,這樣rails自動載入服務文件夾中的類。

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

但是,該應用程序似乎沒有拿起TestService類的更新。我該如何解決這個問題,以便在不重啓服務器的情況下顯示TestService類中的更改。

回答

2

嘗試加載包含可重載常量的文件時,不要使用require

通常情況下,您不需要做任何特殊的事情即可使用該常量。您將直接使用常量,而不必使用require或其他任何東西。

但是,如果你想和你的代碼乾乾淨淨,ActiveSupport爲您提供不同方法,你可以用它來加載這些文件:require_dependency

require_dependency 'test_service' 

class IndexController < ApplicationController 
    ... 
end 

雖然這是令人困惑,你會試圖成爲乾乾淨淨的,並明確加載包含TestService文件,但沒有明確加載包含文件ApplicationController ....

你並不需要改變autoload_paths配置。


更新1

爲了讓Rails的查找和加載常數(類和模塊),你需要做到以下幾點:

你必須確保在每一個增值的恆定你的應用程序位於具有正確文件名的文件中。該文件必須始終位於app的某個子目錄中,例如app/modelsapp/services或任何其他子目錄。如果常量名爲TestService,則文件名必須以test_service.rb結尾。

該算法是:"TestService".underscore + ".rb" #=> "test_service.rb"

filename_glob = "app/*/" + the_constant.to_s.underscore + ".rb" 

因此,如果常數是TestService,則水珠是app/*/test_service.rb。所以堅持在app/services/test_service.rb的常數將工作,app/models/test_service.rb,雖然後者是不好的形式。如果常量爲SomeModule::SomeOtherModule::SomeClass,則需要將該文件放入app/*/some_module/some_other_module/some_class.rb

+0

添加require_dependency ...似乎工作。但是,如果我刪除它,則不會加載對TestService的更改。 – 3coins

+0

撤銷對「autoload_paths」配置的更改。根本不要設置該配置。 – yfeldblum

+0

我已經刪除了。如果我在控制器中沒有require或require_dependency,則獲取此錯誤。未初始化的常量IndexController :: TestService – 3coins

0

你說你的文件在app/server,但你自動加載app/service。哪個是對的?

將您的文件重命名爲app/service/test_service.rb並且自動裝帶器應該工作。 Rails在自動加載路徑中查找基於snake_的文件名。一旦你的自動加載行爲正確,你也不需要手冊require

+0

我的錯誤,文件在應用程序/服務,我更新了帖子。 – 3coins

相關問題