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