我有一个奇怪的情况,其中$“似乎在通话之间存活,但没有其他功能。它正确地返回第一个通话,并且每个额外的请求都失败。这应该是全局信息,所以它不会只是为了把它放在一个会话中。
注释显示了日志返回的内容,但我对“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 :(得分: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