Getting a list of models, AND custom model directory

I'm building an a client/web application that will rely on custom, simple plugins that will be written as models with single table inheritance to a Widget class. Ideally somebody would just need to create a simple model which extends the parent, placed in the correct directory and it work "just work". I'm avoiding the rails plugin architecture because it should be stupid simple for people to build and install. Unfortunately I'm not sure how to:

* Configure Rails to load models from a directory other than /app/ models/ (is this a 'require' in the environment.rb?) * Get a list of all model objects which inherit from the parent class. They will not have database records at first so I cannot rely on a DB query.

Here's a high level look at how the model plugin would look:

class HelloWorld < Widget

   # Create a serialized hash of default options    def install    end

   # Will be called by the system automatically to execute this plugin    def run       say "Hello World"    end

end

Ideally it would live in RAILS_ROOT/widgets/ directory.

The application will need to know of all the Widget sub-classes in order to automatically call their 'install' and 'run' functions. I'm also considering doing this in Merb, but I have the most experience in Rails and it's for a 24 hour hackfest (at Yahoo!), so I need to build this quickly.

Thanks, Jeremy

I'm building an a client/web application that will rely on custom, simple plugins that will be written as models with single table inheritance to a Widget class. Ideally somebody would just need to create a simple model which extends the parent, placed in the correct directory and it work "just work". I'm avoiding the rails plugin architecture because it should be stupid simple for people to build and install. Unfortunately I'm not sure how to:

* Configure Rails to load models from a directory other than /app/ models/ (is this a 'require' in the environment.rb?)

add the folder(s) to config.load_paths (have a look in environment.rb. There should be a commented out example of this

* Get a list of all model objects which inherit from the parent class. They will not have database records at first so I cannot rely on a DB query.

easiest way to do this is probably to just grab a list of everything in that magic folder (you might as well just require them). ActiveSupport adds a subclasses method to Class, but obviously that will only return classes that have actually been loaded.

Fred

For some reason that is not working. Here's the load_paths line in the environment file:

config.load_paths += %W( #{RAILS_ROOT}/widgets )

And the main widget model (widget.rb):

class Widget < ActiveRecord::Base   set_table_name :widget

Woops, the file was named wrong. Instead of HelloWorld.rb it needed to be hello_world.rb. Now Class.subclass only shows classes that have been instantiated, so I can't quite get a list of subclasses without creating a new instance of all of them.

So how would I loop through the files in the widgets directory and get the class name from each of them? Furthermore, how would I execute that class later dynamically since the class name will be held in a variable?

Thanks, Jeremy

For some reason that is not working. Here's the load_paths line in the environment file:

config.load_paths += %W( #{RAILS_ROOT}/widgets )

What's happening?

Fred

Woops, the file was named wrong. Instead of HelloWorld.rb it needed to be hello_world.rb.

Class.subclass only seems to show classes that have been instantiated, so I can't quite get a list of subclasses without creating a new instance of all of them.

So how would I loop through the files in the widgets directory and get the class name from each of them? Furthermore, how would I execute that class later dynamically since the class name will be held in a variable?

Thanks, Jeremy

Woops, the file was named wrong. Instead of HelloWorld.rb it needed to be hello_world.rb.

Class.subclass only seems to show classes that have been instantiated, so I can't quite get a list of subclasses without creating a new instance of all of them.

They don't need to be instantiated, just loaded. If you Dir.glob your widgets folder and require everything inside it you should be ok.

Fred