2010-02-21 5 views
0

J'ai une situation étrange où $" semble survivre entre les appels, mais rien d'autre ne le fait. Il renvoie correctement le premier appel et échoue à chaque demande supplémentaire. Cela devrait être une information globale, donc ça ne marchera pas juste pour la mettre dans une session. Les commentaires montrent ce que la journalisation retourne, mais mon expérience avec "FileImport.installed_formats()" est que la première fois que je charge une page remplie par elle, elle renvoie correctement ["CSV", "FixedText"]. J'appelle FileImport.installed_formats() plusieurs fois dans le même appel, à des fins de test, et cela fonctionne très bien. Toutefois, lorsque j'actualise la page, la méthode retourne un tableau vide.

Quelle est la "meilleure" solution? Je ne veux pas vraiment supprimer $ destructive » à chaque fois, car je sais que le serveur tente de mettre en cache les classes. Est-il plus propre façon de voir les classes installées sans la méthode 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 

Répondre

0

Je ne suis pas satisfait du comportement des rails ici, mais il semble buggé (qu'il suppose à la fois un module est explicitement disponible, mais ne le liste pas en tant que tel.)

J'ai résolu cela en mettant en cache les noms des installés modules

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

Je ne suis pas 100% content de cette réponse, même si je l'ai donné. Le problème est que les classes elles-mêmes cessent d'exister après le premier processus. –