How to extend an 'unloadable' Rails plugin?

Posted by Vitaly Kushner on Stack Overflow See other posts from Stack Overflow or by Vitaly Kushner
Published on 2010-03-07T20:03:11Z Indexed on 2010/03/11 5:13 UTC
Read the original article Hit count: 592

I'm trying to write a plugin that will extend InheritedResources.

Specifically I want to rewrite some default helpers.

And I'd like it to "just work" once installed, w/o any changes to application code.

The functionality is provided in a module which needs to be included in a right place. The question is where? :)

The first attempt was to do it in my plugin's init.rb:

InheritedResources::Base.send :include, MyModule

It works in production, but fails miserably in development since InheritedResource::Base declared as unloadable and so its code is reloaded on each request. So my module is there for the first request, and then its gone.

InheritedResource::Base is 'pulled' in again by any controller that uses it:

Class SomeController < InheritedResource::Base

But no code is 'pulling in' my extension module since it is not referenced anywhere except init.rb which is not re-loaded on each request

So right now I'm just including the module manually in every controller that needs it which sucks. I can't even include it once in ApplicationController because InheritedResources inherites from it and so it will override any changes back.

update

I'm not looking for advice on how to 'monkey patch'. The extension is working in production just great. my problem is how to catch moment exactly after InheritedResources loaded to stick my extension into it :)

update2

another attempt at clarification:

the sequence of events is

  • a) rails loads plugins. my plugin loads after inherited_resources and patches it.
  • b) a development mode request is served and works
  • c) rails unloads all the 'unloadable' code which includes all application code and also inherited_resources
  • d) another request comes in
  • e) rails loads controller, which inherites from inherited resources
  • f) rails loads inherited resources which inherit from application_controller
  • g) rails loads application_contrller (or may be its already loaded at this stage, not sure)
  • g) request fails as no-one loaded my plugin to patch inherited_resources. plugin init.rb files are not reloaded

I need to catch the point in time between g and h

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about rails