2015-04-17 68 views
2

我一類定義爲這樣:類變量復位/彈簧

class PublicationJob < ActiveJob::Base 
    def self.jobs 
    @jobs ||= Hash{|h, k| h[k] = []} 
    end 
    def self.register(format, job_class) 
    jobs[format] << job_class 
    end 
    # [...] 
end 

要註冊不同的工作類別,我把在初始化:

PublicationJob.register(:tex, SaveJob) 
PublicationJob.register(:saved_tex, TexJob) 
#... 

rails console我嘗試:

PublicationJob.jobs 
#> {:tex => [SaveJob], :saved_tex => [TexJob]} 

但是,如果我退出控制檯(Ctrl-D),然後重新啓動它,在某些時候哈希將是空的!

爲什麼在這種情況下重置類變量?

我使用導軌4.2.1和彈簧,我知道如果我殺死/停止彈簧,它會再次運行一段時間。它與春天有關嗎?

+1

你在修改文件嗎?由於Spring重新加載這些文件,甚至在某些情況下重新啓動應用程序,導致您的數據被擦除。 –

+0

我更新了應用程序目錄中的一些文件,但甚至沒有發佈publication_job:/ – Geoffroy

+0

是的,這可能足以讓Spring重新加載應用程序,具體取決於您已更改的內容。因此擦你的數據 –

回答

1

好的,所以這完全是春天相關的,我通過去除彈簧來修復它。

感謝@NekoNova誰指出我的文檔的右側部分,我發現that

這樣可以節省掉User類的第一個版本,這將不會是相同的對象用戶後該代碼已經被重新裝入:

[...]

因此,爲了避免這個問題,不保存關閉應用常量引用您的初始化代碼。

換句話說,我可以用初始化無法初始化我的班,因爲althought它會在生產工作,它不會在開發工作。

2

我知道這是相當古老的,但我遇到過這個問題幾次,並覺得你不必放棄彈簧,如果你在初始化設置類級變量。

您只需要在彈簧「.after_fork」塊中重新分配它們即可。因此,對於上述問題,發生在「配置/ spring.rb」文件,執行以下操作:

if ("Spring".constantize rescue nil) 
    Spring.after_fork do 
    PublicationJob.register(:tex, SaveJob) 
    PublicationJob.register(:saved_tex, TexJob) 
    end 
end 

春天完成了叉和重新加載代碼後,這將重置這些變量。我將它包裝在一張支票中,以確保Spring可用,這可能不會投入生產。