github
Advanced Search
  • Home
  • Pricing and Signup
  • Explore GitHub
  • Blog
  • Login

craigambrose / plugin_instances

  • Admin
  • Watch Unwatch
  • Fork
  • Your Fork
  • Pull Request
  • Download Source
    • 1
    • 0
  • Source
  • Commits
  • Network (0)
  • Issues (0)
  • Downloads (0)
  • Wiki (1)
  • Graphs
  • Branch: master

click here to add a description

click here to add a homepage

  • Branches (1)
    • master ✓
  • Tags (0)
Sending Request…
Enable Donations

Pledgie Donations

Once activated, we'll place the following badge in your repository's detail box:
Pledgie_example
This service is courtesy of Pledgie.

Allows you to create or install other plugins which can be "instanced" multiple times at different urls inside your app. — Read more

  cancel

http://www.craigambrose.com

  cancel
  • Private
  • Read-Only
  • HTTP Read-Only

This URL has Read+Write access

changes to routing patches to allow more pliki functionality 
craigambrose (author)
Sun Mar 29 23:14:37 -0700 2009
commit  a8d349920b844cdb8943b0b07b15a5f0f7e6bd3c
tree    3b435420221d128b519020cd8b57257a8bbdb38a
parent  fbf984fd0e2f899f2938bc906357099aaac630fa
plugin_instances /
name age
history
message
file MIT-LICENSE Loading commit data...
file README
file Rakefile
directory db/
file init.rb
file install.rb
directory lib/
directory spec/
directory tasks/
file uninstall.rb
README
PluginInstances
===============

Found at:
http://github.com/craigambrose/plugin_instances/

This plugin allows you to have individual route sets for other plugins, including a unique instance id. 

Without using this plugin you can specify a routes.rb in your plugins (as of rails 2.3), and these routes are merged 
into the global route set used when determining how to process the current request. This is great for allowing a plugin 
to introduce a set of functionality which exists only once on the site (like a login system).

The PluginInstances plugin is designed to enable individual instances of plugins to be placed in different places on the 
site. For example, lets say that your site is content managed, and has tabs across the top which link to various types 
of functionality:

In your application's routes.rb file:

  map.plugin_instances "/tabs/:id"

When a request is detected with a path like "/tabs/23/admin", it realises that this matches the plugin_instances route, 
finds the relevant instance (eg: PluginInstance.find(23)), asks that instance what plugin it represents (eg: a forum, 
user profile, etc), and then passes the route "/admin" to the route set for that plugin, along with the plugin instance 
object. Thus, a forum plugin could be written which can be instantiated at different places in the site, and just has to 
scope itself using the plugin instance id.


Installation
============

This Requires Rails 2.3.2, I aim to support future rails versions, but not previous ones. Don't even bother trying, the 
code which this plugin monkey patches has changed dramatically from previous versions.

Install the plugin

  script/plugin install git://github.com/craigambrose/plugin_instances.git

Ensure that the migration at /vendor/plugin/plugin_instances/db/migrate/ gets run. You can either copy it into your 
application's own migration directory, or preferable install the plugin migrations plugin at 
http://github.com/jodosha/plugin_migrations/

In your environment.rb, ensure that the plugin instances plugin gets loaded before any plugins that use it. If you use 
plugin migrations, it needs to get loaded after that. For example:

  config.plugins = [ :plugin_migrations, :plugin_instances, :all ]

Create a route using the "plugin_instances" method in your application's routes.rb file. It follows all the normal rules 
for determining route priorities, but it matches all requests *starting* with the specified path.

  map.plugin_instances "/pages/:id"

Install or create plugins which use plugin instances (see below).


Plugin Development
==================

To create a Rails plugin to for use with PluginInstances, it should have the following directory structure (plus any 
other normal plugin files):

    /my_plugin
      /app
        /controllers
          /my_plugin
             ... some controllers here
        /models
          /my_plugin
            ... some models here
        /views
          /my_plugin
            ... some views here
      /config
        routes.rb
      /db
        /migrate

As you can see, this is just the normal rails application structure. Note however that controllers (and thus views) and 
models have been namespaced with the name of the plugin. This is to prevent name clashes between different plugins, and 
is generally good practice. Also, it is a convention enforced by the PluginInstances routing system.

Inside the routes.rb file for your plugin, the draw block is declared slightly differently, as follows:

    PluginInstances::RouteSetManager.routes_for('my_plugin').draw do |map|
    
      map.namespace :my_plugin do |my_plugin|
        my_plugin.resource :posts
      end
  
      map.root :controller => 'my_plugin/posts', :action => 'show'    
    end

As you can see, your plugin name is needed in the first line opening the draw block, as it needs to know which route set 
to write these routes for. Inside the block, routing works as normal, except that you'll want to declare your namespace 
as mentioned above. In theory, you can even use map.plugin_instances inside this block, although I haven't tried it.

Finally, all controllers in your plugins should inherit from the PluginInstances::PluginController class. For example:

    module MyPlugin
      class PostsController < PluginInstances::PluginController

        ... your actions
    
      end  
    end

PluginController inherits from your application controller, so anything introduced there is still present. In addition, 
it introduces one instance method in particular that you will need, "plugin_instance" which returns the plugin instance 
model for the current request. You will need to use this model's id to scope all the data in your plugin, so that it can 
load different data for each instance. Everything else is up to you. :)


Thanks
======

This plugin draws heavily on code from the excellent "desert" (MIT licensed) plugin, from Pivotal labs, although it does 
a different thing and both plugins should probably not be installed in the same app.

http://github.com/pivotal/desert


---------------
PluginInstances
http://github.com/craigambrose/plugin_instances/

Copyright (c) 2009 Craig Ambrose, released under the MIT license
Blog | Support | Training | Contact | API | Status | Twitter | Help | Security
© 2010 GitHub Inc. All rights reserved. | Terms of Service | Privacy Policy
Powered by the Dedicated Servers and
Cloud Computing of Rackspace Hosting®
Dedicated Server