路由基于Rails引擎的插件中的命名空间问题

Fou*_*usa 9 ruby-on-rails rails-engines

我正在尝试创建一个动态界面.我的模型类存在的地方,我的控制器是在启动应用程序时动态创建的.

一切都发生在创建资源的路径文件中!

ActionController::Routing::Routes.draw do |map|
  map.namespace :admin do |admin|
    TestAdmin.models.each do |m|
      admin.resources m.to_s.tableize.to_sym
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

然后是我的BeAdmin类,它执行以下操作:

module TestAdmin
  def self.included(base)
    base.extend(ClassMethods)
  end

  module ClassMethods
    def beadmin(options = {})
      namespace_name = "Admin"
      class_name = "#{self.to_s.pluralize.capitalize}Controller"
      klass = namespace_name.constantize.const_set(class_name, Class.new(ApplicationController))
      klass.module_eval do

        def index
          render :text => "test"
        end
      end
    end
  end

  def self.models
    all_models = []
    Dir.chdir(File.join(Rails.root, "app/models")) do
      Dir["**/*.rb"].each do |m|
        class_name = m.sub(/\.rb$/,"").camelize
        klass = class_name.split("::").inject(Object){ |klass,part| klass.const_get(part) }
        all_models << "#{class_name}" if klass < ActiveRecord::Base && !klass.abstract_class?
      end
    end
    all_models
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,当您浏览到/ admin/users(来自User模型)时,您将看到"test".所以它很棒!

但是我只是简单地刷新浏览器而被调用的控制器变成了UsersController #index而不是Admin :: UsersController #index ...由于某种原因,他失去了它的名称空间......

也许这里的另一个重要方面是我将所有这些添加为插件和用户Rails Engines所以我可以创建一个可插拔的界面...

但到目前为止没有运气,因为我的路线似乎在某个地方迷路了!

在此先感谢您的帮助!

耶勒