$“在通话之间幸存

时间:2010-02-21 18:55:36

标签: ruby-on-rails ruby

我有一个奇怪的情况,其中$“似乎在通话之间存活,但没有其他功能。它正确地返回第一个通话,并且每个额外的请求都失败。这应该是全局信息,所以它不会只是为了把它放在一个会话中。

注释显示了日志返回的内容,但我对“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 :(得分: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