ApplicationController class method not being called each page load

Ruby 2, Rails 4, bundler

I'm trying to package a bunch of my own reusable libs into gems. I did this quite some time ago for Ruby 1.8, Rails 3. Now I'm updating everything, and trying a new approach to the gem structure as well. Something is hinky, and I've run out of ideas to figure it out.

At this point I have a fresh Rails 4 project, and working on my first gem--it's a logger which I have used for eons.

In ApplicationController I have:

class ApplicationController < ActionController::Base   global_logger :chatty end

The problem I am seeing is that global_logger is being run only one time. In all my previous versions (as a Rails 2 plugin, and a Rails 3 gem) that class method runs from scratch every page load and I count on that behavior to do some things. In this new Rails 4 setup, it is running the first time and that's it. The rest of my logger code (writing messages from subsequent controllers) seems to work fine.

Is there some new thing to Ruby 2 / Rails 4 I've not read about?

Anyway, before I spew 4 pages of code details, my first question is whether or not the running-once behavior is something new which is expected (doesn't make sense to me but who knows).

If not, then I can provide some details of how I've structure the gem, and the class methdods.

I am sure you are mistaken. That code will only be interpreted when the class is loaded (which, by default, in development mode will be at every action, but in production will only be when the server is started). That is true in Rails 3 and Rails 4. Try putting a puts statement above your global_logger line in your rails 3 app and you will see that this is correct. Of course it is entirely possible that the effects of calling global_logger may have changed, that depends on what is in that method.

Colin

The development mode code reloader is much smarter as of rails 3.2 - it no longer reloads everything on every request. It will only reload a file if it thinks it needs to (although it almost certainly errs on the side of caution). If you want something to run on every request, use a before/after/around filter

Fred

Thanks for that clarification Fred, that explains why the OP is seeing a change in development mode. I presume the situation in production has not changed, so in that case in rails 3 global_logger would only have been run on server start and that is still the case.

Colin

I did forget to clarify I only care about :development, and definitely not mistaken about what I'm seeing.

However, now that Fred mentions 3.2 specifically, that's relevant. While I'm running some small sites on 3.2, I mostly used this global_logger code in the dev of some big sites on 2.0 through 3.1 -- been doing non-ruby thing s since about when 3.2 came out, so haven't really relied on it during new development like I am now with 4.

OK, I'll give the before filter angle a whirl.

Thanks (as always) Fred.