skoggins
2007-Jan-31 23:36 UTC
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? 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 @slot2 = Ad.find(:first, :conditions => "locked_slot = 2") if @slot2 @ad2 = @slot2 else @ad2 = @ads.shift @ads.push(@ad2) end @ad2.times_displayed = @ad2.times_displayed + 1 @ad2.save @slot3 = Ad.find(:first, :conditions => "locked_slot = 3") if @slot3 @ad3 = @slot3 else @ad3 = @ads.shift @ads.push(@ad3) end @ad3.times_displayed = @ad3.times_displayed + 1 @ad3.save @slot4 = Ad.find(:first, :conditions => "locked_slot = 4") if @slot4 @ad4 = @slot4 else @ad4 = @ads.shift @ads.push(@ad4) end @ad4.times_displayed = @ad4.times_displayed + 1 @ad4.save @slot5 = Ad.find(:first, :conditions => "locked_slot = 5") if @slot5 @ad5 = @slot5 else @ad5 = @ads.shift @ads.push(@ad5) end @ad5.times_displayed = @ad5.times_displayed + 1 @ad5.save i = 1 @ads.each do |ad| ad.rank = i i = i + 1 ad.save end end Thanks! -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
R Mason
2007-Feb-01 02:16 UTC
Re: Ad rotation: Calling an action each time a layout is dis
I don''t entirely understand your question, but maybe this would help: http://api.rubyonrails.org/classes/ActionController/Filters/ClassMethods.html Check out "Filter Chain Skipping". Don''t put stuff in your ApplicationController unless more than one Controller needs those methods, as a general rule of thumb. Also, I''m no Ruby/Rails expert, but that code is very, very repetitive. I''m am almost sure there''s a way to slim that down dramatically. I mean, look at it this way. Let''s say you make one change to the first chunk of code... Now you''d have to change all four other chunks by hand. That would suck. -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
askegg
2007-Feb-01 05:33 UTC
Re: Ad rotation: Calling an action each time a layout is display
On Feb 1, 10:36 am, skoggins <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> 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.> > i = 1 > @ads.each do |ad| > ad.rank = i > i = i + 1 > ad.save > end > > end > > Thanks! > > -- > Posted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---