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.
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.
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?
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?
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.