我正在经历我认为以前经历过的一个非常常见的问题,尽管这次我似乎无法找到解决方案。
我的路由的定义依赖于Item
的子类加载,如图所示(实际路由过于复杂而无法发布):
match ":style/:item_type/search", to: "items#search", constraints:
{
item_type: Item.searchable
}
请注意Item
不是Rails / AR模型,它只是一个Ruby类。 Item
类具有以下两个类方法:
def self.all_types
return @all_types if @all_types && @all_types.any?
Dir.glob(File.join(Rails.root, 'app', 'models', 'items', '*.rb')).each do |descendant|
require descendant
end
@all_types = self.descendants
end
def self.searchable
all_types.select{ |i| i.searchable? }
end
基本上,我们需要每个文件,然后询问一个类方法,如果你可以搜索或不显然返回true或false。
我的问题是即使这个方法失败了,如果我在Dir.glob
块下面插入调试器语句并检查self.descendants
的值,我会找到一个空数组。
请注意,仅在我编辑任何相关文件并尝试在开发模式下继续使用我的服务器后才会发生。也就是说,如果我编辑item.rb
或子类awesome_item.rb
,则@all_types数组为空并且我的路由会崩溃。
我希望这是足够的信息。我试过阅读自动加载文档,但要么我不明白它们如何使我受益,或者它不是我正在寻找的解决方案。