Ad rotation: Calling an action each time a layout is display

Hi all,

I coded a method named "place_ads" that I have in my Ad Controller that I would like to call each time my "ads.rhtml" or "user.rhtml" layout is displayed but not when my "admin.rhtml" is displayed.

Should I put the method in the Application Controller and use a before filter? Is there a way to exclude the views in the Admin Controller from calling the method then. Or would I be better off leaving the code in the Ad controller and somehow calling it from the layout?

INARD (I am not a Rails Developer, ahh..... yet), but couldn't you put in your view:

<%= render :partial => "ads/place_ad.rhtml" if !@user.admin? %>

This would also require a "admin?" method on the user, but that should be easy.

Here is my code (haven't got around to writing a function yet):

class AdController < ApplicationController layout "ads"

def place_ads

    #Creates an ordered array   @ads = Ad.find(:all, :order => "rank", :conditions => "locked_slot = 0")

  @slot1 = Ad.find(:first, :conditions => "locked_slot = 1")   if @slot1     @ad1 = @slot1   else     @ad1 = @ads.shift     @ads.push(@ad1)   end   @ad1.times_displayed = @ad1.times_displayed + 1   @ad1.save

This code repeats a lot (as the previous poster said) - why not convert the @slots to an array and loop/inject over @ads to populate it? This would also require refactoring of the view - I would suggest passing the @slots to a partial as a collection.