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

<%= image_tag(Banner.banner) %>

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

On Jan 21, 2007, at 4:30 AM, ogurec wrote:

query to
layout.rhtml

<%= image_tag(Banner.banner) %>

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

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…)

Craig B.

AIM: kreiggers

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

db usingBannermodel:

whatever…)

Craig B.

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

2007/1/25, ogurec [email protected]:

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

In your model

class Banner < ActiveRecord::Base

class << self
def random(limit=1)
find(:all, :order => ‘RAND()’, :limit => limit)
end
end
end

In your view/controller

@banners    = Banner.random(3)

Alain

Ilja Ivanov wrote:

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

Just use rand() to select the banner to show. If you want different
weights, there’s WeightedSelection
(http://www.gemjack.com/gems/WeightedSelection-1.0.0/).

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