I am extending a class (which is in a plugin) by including a module, this is done in an initializer.
require 'qwerty/core/user'
User.send :include, Qwerty::Core::Extensions::User
However in development before every request (and after reload! is called in the console) all models are reloaded but because the initializers are not run again the module is not included. Leaving a model with 'missing parts'.
Because the model is in a plugin it does not seem wise to include code directly in the class which would be the usual approach.
For now I have simply added a before_filter which includes the module if in development environment. But I have copy/pasted and have duplicate code in the initializer and application controller.
# Class extensions in initalizers are over-writtern each request
def development_loading
if RAILS_ENV == 'development'
User.send :include, Qwerty::Core::Extensions::User
end
end
Is there a better way?
As a side note the plugin is mine, so I could add code in to it, but the extensions held in the module may not always be present...
At first I was going to advise something about adding a 'development' directory to the front of your load path in development mode, so that your revisions would always get reloaded first... But then it occurred to me that you said something confusing.
The model you're trying to extend. It's in a plugin? Plugins aren't supposed to be reloaded by default in development mode, unless the app explicitly says they should in its configuration by setting
Config.reload_plugins?
to false.But if, for some reason, your plugin is reloading anyway and you don't want it to, you can put this in your plugin's init.rb to explicitly say it shouldn't reload:
See the Rails docs on the Configuration class for more detail: http://api.rubyonrails.org/classes/Rails/Configuration.html#M002536
environment.rb
The code is the block is run before every request in development mode and once in production mode.
In Rails 3.x you can configure a block to run every time reloads happen (in development mode, or when
config.cache_classes = false
). This would go in an initializer:Slightly more elegant solution than the one accepted since it can be put in an initializer:
Why do you use initializers to include functionality?
Try the following instead: