Проблема маршрутизации с пространствами имен в плагине на основе Rails Engine - PullRequest
9 голосов
/ 05 марта 2010

Я пытаюсь создать динамический интерфейс. Там, где существуют мои классы моделей и мои контроллеры создаются динамически при запуске приложения.

Все происходит в моем файле маршрутов, где создаются ресурсы!

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

И затем есть мой класс 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

И теперь, когда вы переходите к / admin / users (из модели User), вы видите «test». так что отлично работает!

Но тогда я просто делаю простое обновление браузера и вызываемый контроллер становится UsersController # index вместо Admin :: UsersController # index ... Он почему-то теряет свое пространство имен ...

Может быть, еще один важный аспект заключается в том, что я добавил все это как плагин и пользовательский Rails Engines, чтобы я мог создать подключаемый интерфейс ...

Но пока не повезло, потому что мои маршруты где-то потерялись!

Заранее спасибо за помощь!

Джелле

...