making something available application wide

I'd like to display a banner on every page. Ultimately I'll be tweaking
which banner is displayed via different controllers but initially I'd
just like to set a single banner application wide and display it in my
"_header", a partial I include in all layouts.

I've got a BannerAdvert model, simple. If I'm in my welcome controller
index action I can simply do,

@banner_url = BannerAdvert.first.url

in my _header partial (view) I display the url, works fine.

bingo bob wrote:


I'd like to display a banner on every page. Ultimately I'll be tweaking
which banner is displayed via different controllers but initially I'd
just like to set a single banner application wide and display it in my
"_header", a partial I include in all layouts.
I've got a BannerAdvert model, simple. If I'm in my welcome controller
index action I can simply do,
@banner_url = BannerAdvert.first.url
in my _header partial (view) I display the url, works fine.
-----
BUT - my header is called from other controllers, I don't want to be
non-dry and repeat @banner_url = BannerAdvert.first.url all over the
place.
I'd like to set @banner_url = BannerAdvert.first.url application wide
for now - how do I do this, should be easy but I'm having a Friday
afternoon mental block! I thought application_controller and
application_helper, but putting the code in either of those two didn't
work.
Please help cure my insanity, any inspiration really appreciated.

You could put the
@banner_url = BannerAdvert… in you application_controller.rb. Make it
a before_filter and then display it in your layout.

Aha !

"You could put the @banner_url = BannerAdvert.. in you
application_controller.rb. Make it a before_filter."

That's the bit I missed then, I just stuck @banner_url =
BannerAdvert.first in the application_controller.rb, I need a
before_filter to call a method in that controller - that right ?

bingo bob wrote:

Aha !

"You could put the @banner_url = BannerAdvert.. in you
application_controller.rb. Make it a before_filter."

That's the bit I missed then, I just stuck @banner_url =
BannerAdvert.first in the application_controller.rb, I need a
before_filter to call a method in that controller - that right ?

No; you could call it explicitly every time. But you usually wouldn't
want to. :slight_smile:

Best,

Making it a before_filter makes it so you won't need to call the
method to set your banner every single time. It will be done before
any action is called.

Thanks to all, settled on this code in the end in case useful to anyone
else - further tips appreciated, works great though.

class ApplicationController < ActionController::Base

  before_filter :grab_banner

  def grab_banner
    banner = BannerAdvert.first(:conditions => [ "published >= ?", 1],
:order => "RAND()")
    if banner
      @banner_url = banner.url
    end
  end

end

I realised "lightening bolt", that for many thing I don't actually NEED
an admin interface/scaffold - like in this case I just created a
BannerAdvert model and I CRUD the records directly with Sequel Pro.
Anyone comment on this approach - saves me hours and keeps the app
clean. Silly, simple tip - no more scaffolded code - except when it
helps me - feels like coming on to the next stage.. :-).

Even if you're currently only working with a single database, it might
be a good idea to abstract that last statement. Different DBs use a
different syntax, so for example I'd write that as

   :order => RANDOM

where RANDOM is set in an initializer based on the DB actually being
used, e.g. <http://pastie.org/1029327>

I work in a lot of "mixed" environments, so that may be more useful to
me than most people, but...

FWIW,