我遇到一个问题,我的Rails应用程序设置为在登台或生产环境中运行时缓存类。虽然load_paths只包含'app / models',但似乎初始化步骤以'app / models'的形式递归缓存所有内容。
# Eager load application classes
def load_application_classes
if configuration.cache_classes
configuration.eager_load_paths.each do |load_path|
matcher = /\A#{Regexp.escape(load_path)}(.*)\.rb\Z/
Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
require_dependency file.sub(matcher, '\1')
end
end
end
end
这个问题是我们在'app / models'中有一个子目录,它包含带有引用并发JRuby环境的require语句的文件。由于Rails对此环境一无所知,因此我们的应用程序会在加载时中断。
目前,这里提出的解决方案......不幸的是只有#1是理想的。
1)最简单的解决方案是排除罪魁祸首子目录,但没有找到任何方法来实现这一点。
2)Monkey修补load_application_classes方法以跳过特定的子目录。
3)将子目录从'app / models'下移出。感觉有点hackish,需要进行相当多的代码更改。
思想?
答案 0 :(得分:1)
作为临时措施,您可以使用选项2的版本并覆盖load_application_classes的定义,将其替换为空实现。这将迫使您明确要求您需要的类,但它可以让您完全控制加载的内容,并且是一个完全透明的解决方案。
听起来你的应用程序非常复杂,它已经超越了Rails框架。我知道这不会直接回答你的问题所以提前做出了批评,但你可能想考虑一下像Merb这样的替代Ruby框架。 Rails是伟大的,但迟早你碰到框架的边缘 - 听起来就像你现在的位置。
我们去年改用Merb并且没有重新处理它。
克里斯