2010-02-21 16 views
0

我有一個奇怪的情況,其中$」似乎在通話之間仍然存在,但沒有其他任何事情。它正確地返回第一個電話,並且失敗每個額外的請求。這應該是全球信息,所以它不會僅僅將它放在會話中。

這些註釋顯示了什麼是日誌記錄返回,但是我對「FileImport.installed_formats()」的體驗是第一次加載由它填充的頁面時,它正確返回[「CSV」,「FixedText」]。爲了測試目的,我在同一個調用中多次調用FileImport.installed_formats(),並且它工作正常。但是,當我刷新頁面時,該方法返回一個空數組。

什麼是「最佳」修復?我真的不希望破壞性刪除$」每一次,因爲我知道服務器試圖緩存類。是否有可以查看已安裝的類不Class.constants方法的更清潔的方式?

def FileImport.installed_formats() 
    FileImport.require_import_folder() 
    return FileImport.constants 
end 

def FileImport.require_import_folder()  
    logger = RAILS_DEFAULT_LOGGER 

    #this is giving me what I expect... ["lib/file_import/fixed_text.rb", "lib/file_import/csv.rb"]  
    logger.debug("WHY? " + Dir["lib/file_import/*.rb"].inspect) 

    #This is giving me two different things: 
    #First run: [] 
    #Second run: ["lib/file_import/fixed_text.rb", "lib/file_import/csv.rb"] 
    logger.debug(($".select {|v| v =~ /file_import/}).inspect) 
    Dir["lib/file_import/*.rb"].each do |i| 
    i.sub(/lib\//,"") 
    # $".delete(i)  #I'd rather not do this, if there's a cleaner way... 
    require i 
    end 

    #first time, this gives what i want: ["CSV", "FixedText"] 
    #When I refresh, I get [] instead... 
    logger.debug("SHOULDINSTALL: " + FileImport.constants.inspect) 

    #Both times this gives the expected: ["lib/file_import/fixed_text.rb", "lib/file_import/csv.rb"] 
    logger.debug(($".select {|v| v =~ /file_import/}).inspect) 
end 

回答

0

我對這裏的rails的行爲並不滿意,但似乎有錯誤(它假設模塊是明確可用的,但沒有列出)。

我通過緩存安裝的名稱模塊

def FileImport.installed_formats() 
    FileImport.require_import_folder() 
    installed_formats = Rails.cache.read("installed_upload_formats") || [] 

    installed_formats = (installed_formats + FileImport.constants).uniq 
    Rails.cache.write("installed_upload_formats",installed_formats) 
    return installed_formats 
end 
+0

即使我給了我這個答案,我還不是100%滿意。問題在於,在第一個過程之後,類本身不再存在。 – 2010-02-21 19:48:31