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
on 2007-01-21 13:30
on 2007-01-21 18:44
On Jan 21, 2007, at 4:30 AM, ogurec wrote: > query to > *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? 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 Beck AIM: kreiggers
on 2007-01-21 19:38
Can you give me some advice, how to do this?
on 2007-01-22 19:15
> > db usingBannermodel: > > <div id="headerbanner"> > 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?
on 2007-01-25 15:17
on 2007-01-25 17:35
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@example.com>:
on 2007-01-25 18:31
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/).
on 2007-01-27 22:39
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
on 2007-01-30 22:15
First I assumed, that the quantity of images in table will be constant. But later the problem has become complicated ( for me as newbie :) ), 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.to_s ), banner.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