$ "выживает между звонками - PullRequest
0 голосов
/ 21 февраля 2010

У меня странная ситуация, когда $ ", кажется, выживает между вызовами, но больше ничего не делает. Он правильно возвращает первый вызов и не выполняет каждый дополнительный запрос. Это должна быть глобальная информация, поэтому она не будет работать только для поместите это в сессию.

Комментарии показывают, что возвращает журналирование, но мой опыт работы с 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

1 Ответ

0 голосов
/ 21 февраля 2010

Я не доволен поведением рельсов здесь, но оно кажется некорректным (то, что оно предполагает наличие модуля явно доступным, но не отображает его как таковое).

Я решил эту проблему, кэшировав имена установленных модулей.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...