最近在做一个基于Controller加Action的权限管理插件,需要得到应用中的所有Controller作为一个列表供用户选择,这可以通过ApplicationController.subclasses得到,但是Rails在启动时并不会自动加载所有Controller,而是当请求到达时,根据路由来决定应该加载那个Controller,因此要使用ApplicationController.subclasses,就必须先require所有的Controller:
def require_all_controllers(path)Dir.new(path).entries.collect do |e|controller_path = File.join(path, e)if e[0] != 46 # 46 = '.'if File.directory?(controller_path)require_all_controllers(controller_path)elsif e =~ /controller.rb$/ApplicationController.require_or_load controller_pathendendendend
require_all_controllers将加载指定目录下的所有以controller.rb结束的文件,你也可以选择将结果缓存起来,这样就不需要每次都重新require了:
@@all_controllers = nildef get_all_controllersrequire_all_controllers("#{RAILS_ROOT}/app/controllers") unless @@all_controllers@@all_controllers ||= ApplicationController.subclassesend
至于Action,可以直接调用Controller的action_methods方法得到。
相关资源:敏捷开发V1.0.pptx