simple banner / ad rotation on page (newbie question)

Hi, i try to figure out the solution for simple banner ad script. I've db table 'banners' with fields 'id', 'image', and 'url'. I suppose to keep in this table 5 banners, so the ids are always from 1 to 5. I just wont to loop from 1 to 5 and show appropriate banner, in header layout (not view).

At this time i put the banner into layout's header with direct query to db using Banner model:

*banner.rb* class Banner < ActiveRecord::Base def self.banner @banner = Banner.find(:first, :conditions => ['date_end > ?', Time.now.strftime("%Y-%m-%d %H:%M:%S")]) @banner.nil? ? "adimage.gif" : @banner.image end

*layout.rhtml* <div id="headerbanner"> <%= image_tag(Banner.banner) %> </div>

I think i must increment some variable in layout.rhtml and return this to Banner model. Or there is a better way? Thanks in advance

How about having your layout call a banner_controller that handles the logic of picking which banner to present to the user?

That seems like a more natural place to keep the logic, and a far better place to extend from later (view tracking, click tracking, whatever...)

Can you give me some advice, how to do this?

> Hi, > i try to figure out the solution for simplebannerad script. I've db > table 'banners' with fields 'id', 'image', and 'url'. I suppose to > keep > in this table 5 banners, so the ids are always from 1 to 5. > I just wont to loop from 1 to 5 and show appropriatebanner, in header > layout (not view).

> At this time i put thebannerinto layout's header with direct > query to > db usingBannermodel:

> *banner.rb* > classBanner< ActiveRecord::Base > def self.banner > @banner=Banner.find(:first, :conditions => ['date_end > ?', > Time.now.strftime("%Y-%m-%d %H:%M:%S")]) > @banner.nil? ? "adimage.gif" : @banner.image > end

> *layout.rhtml* > <div id="headerbanner"> > <%= image_tag(Banner.banner) %> > </div>

> I think i must increment some variable in layout.rhtml and return this > toBannermodel. > Or there is a better way?How about having your layout call a banner_controller that handles the logic of picking whichbannerto present to the user?

That seems like a more natural place to keep the logic, and a far better place to extend from later (view tracking, click tracking, whatever...) -- Craig Beck

AIM: kreiggers

In my layout i call the method 'banner' of BannerController class: <%= image_tag(BannersController.banner) %>

But how the controller "remembers" which banner is currently shown to user ? How or where is possible to store the id of last banner?

any suggestion?

define / require this in your environment.rb (or in lib or somewhere else):

class Counter

@@counter = 0

def self.nextValue @@counter = @@counter + 1 end

end

in your action do this:

def my_action @counter = Counter.nextValue end

now you can access the current counter value in your view

<%= @counter %>

This is sufficient for rotating banners imho

If you use MySql (not sure RAND()) works with other DB) :

In your model

First I assumed, that the quantity of images in table will be constant. But later the problem has become complicated ( for me as newbie :slight_smile: ), because I've added the field 'date_end', so that banner can expire. It means, that the quantity of images varies, and a very simple looping through id in table does not give the solution.

Because as result of executing code @banners = Banner.find(@counter, :conditions => ['date_end > ?', Time.now.strftime("%Y-%m-%d %H:%M:%S")]) i has error like 'Could not find record with id = X and Date_end > Today'

I tried @banners.nil? and similar statements (blank, empty), but with no success. I think, this is because the error occures before the @banners became some value or nil at all.

As my first post says, banners table has fields 'id', 'image', and 'url'.

At this time process works this way:

in environment.rb i've added the Counter class as Peter Ertl suggested. class Counter   @@counter = 0   def self.increment_cnt     @@counter += 1   end   def self.toone_cnt     @@counter = 1   end end

in controller that manages banners: def self.banner   @counter = Counter.increment_cnt   @banners = Banner.find(:all,   :conditions => ['date_end > ?', Time.now.strftime("%Y-%m-%d %H:%M: %S")])   if @counter > @banners.size then     @counter = 1     Counter.toone_cnt   end

  [[@banners[@counter-1].image] , [@banners[@counter-1].url]] end

in layout <% banner = BannersController.banner %> <%= link_to image_tag(banner[0].to_s ), banner[1].to_s %>

So, this way i do not loop through ids of records in tables, but through elements of @banners array. Elements are in fact ActiveRecord objects, it doesn't matter what ids they had