Heinbull,

I tried to use the before_filter in my Cart Model...mind you it's not an
actual sql table, it's just a class I created.  From looking at reference
tools it looks like before_filter is usually used for actualy table
models.... but I tried it any way and I got the error "undefined method
before_filter for Cart:Class".

My Cart.rb file reads:
class Cart
  attr_reader :items ,:total_price
  before_filter :initialize_cart

  def initialize
    @items = []
    @total_price=0
  end


  def add_product(product)
    current_item = @items.find {|item| ((item.product.title ==
product.title) &&
(item.product.itemType==product.itemType)&&(item.product.itemType==product.itemType))}

    #pass in the item object, returns the one being added item where
item.album equals the
    #album is the title of the album in this case
    #traverses through the items array, if item[album]=album if the objects
match up then it adds the album
    if current_item
      current_item.increment_quantity
      current_item.increment_price
      @[EMAIL PROTECTED]
    else
      @items << CartItem.new(product)
      @[EMAIL PROTECTED]
    end
  end

  private
  def initialize_cart
      unless session[:cart] # if there's no cart in the session
            session[:cart] = Cart.new # add a new one
        end #for the unless
    @cart=session[:cart]
    end

end


any insight?  it would be optimal if I could use the before_filter so i
owuldn't have to do find_cart in every page controller

On Sun, Sep 28, 2008 at 3:59 PM, Jon Liu <[EMAIL PROTECTED]> wrote:

> Phillip , my inventory_controller.rb:
>
> class InventoryController < ApplicationController
>
>   def index
>       @albums=Album.find(:all)
>       @cart=find_cart
>   end
>
>
>
>   def add_to_cart
>           itemType=params[:itemType]
>                productId=(params[:id]) #parameter passed in from "add to
> cart" submission, it's either 1 or 2 in this case
>
>                if itemType=='album'
>                     product_temp=Album.find(productId)
>                     dest='/inventory'
>                 end
>                 if itemType=='dvd'
>                     product_temp=Dvd.find(productId)
>                     dest='/inventory/dvd'
>                 end
>
>
> product=Product.new(itemType,product_temp.title,product_temp.price)
>                @cart=find_cart
>                @cart.add_product(product)    #add the album to the cart in
> the sessions
>     redirect_to dest
>   end
>
>   def check_out
>       @cart=find_cart
>       redirect_to '/inventory/checkOut'
>     end
>
>   def review
>       @cart=find_cart #for shopping car display in the sidebar
>       @title=(params[:title])
>       @itemType=(params[:itemType])
>
>       if @itemType=='album' #must be a better way to reduce the amount of
> redundant code
>           @album=Album.find_by_title(@title)
>           @review=Review.new
>           @[EMAIL PROTECTED] #Review.find(:all, :conditions => ["album
> = ?", @title])
>       end
>       if  @itemType=='dvd'
>           @dvd=Dvd.find_by_title(@title)
>           @review=Review.new
>           @[EMAIL PROTECTED] #Review.find(:all, :conditions => ["album =
> ?", @title])
>       end
>   end
>
>   def dvd
>       @cart=find_cart
>       @dvds=Dvd.find(:all)
>     end
>
> end
>
> my application.rb:
> # Filters added to this controller apply to all controllers in the
> application.
> # Likewise, all the methods added will be available for all controllers.
>
> class ApplicationController < ActionController::Base
>   helper :all # include all helpers, all the time
>     # session :session_key => '_inventory_session_id'
>   # See ActionController::RequestForgeryProtection for details
>   # Uncomment the :secret if you're not using the cookie session store
>   protect_from_forgery # :secret => '33dad663a17f28eb93b293523bcb06f2'
>
>   def find_cart
>        unless session[:cart] # if there's no cart in the session
>             session[:cart] = Cart.new # add a new one
>         end #for the unless
>     session[:cart] # return existing or new cart
>        #session[:cart] ||=Cart.new #creates 1 cart session
>        #can also be written more efficiently as above
>   end
>
>   def empty_cart
>       session[:cart]=nil
>       redirect_to '/inventory'
>     end
>
>
>   def find_cart
>        unless session[:cart] # if there's no cart in the session
>             session[:cart] = Cart.new # add a new one
>         end #for the unless
>     session[:cart] # return existing or new cart
>   end
>
>   def log_out
>       session[:login]=nil
>         redirect_to '/inventory'
>     end
>
> end
>
>
> find_cart is in application.rb and is used by many of the methods in my
> inventory_controller file.  for some reason it doesn't pull up any data when
> in the check_out method....
>
>
> On Sun, Sep 28, 2008 at 2:14 PM, heimdull <[EMAIL PROTECTED]> wrote:
>
>>
>> From experience I would use a before_filter to load the cart for you
>> controller...
>>
>> Something like:
>>
>> before_filter :initialize_cart
>>
>>  private
>>
>>  def initialize_cart
>>    if session[:cart_id]
>>      @cart = Cart.find(session[:cart_id])
>>    else
>>      @cart = Cart.create
>>      session[:cart_id] = @cart.id
>>    end
>>  end
>>
>> If you have an action you don't want the cart you can use :except =>
>> "name"
>>
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
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@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to