@session['user'] vs session[:user]

This might seem really simple to some but just wanted to ask: what is the difference between @session['user'] and session[:user] ? and how would you use each?

And another question, I have the following code:

def get_customer     if @session['customer']       @c = Customer.find(@session['customer'])     end   end

  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

How do I assign the cart to the logged in customer?

Thanks in advance, Elle

This might seem really simple to some but just wanted to ask: what is the difference between @session['user'] and session[:user] ? and how would you use each?

@session is deprecated. Use session (which is a method).

And another question, I have the following code:

def get_customer     if @session['customer']       @c = Customer.find(@session['customer'])     end   end

  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

How do I assign the cart to the logged in customer?

Not entirely sure what you mean, but you've got an @cart containing a cart and @c containing your customer so you should be able to put the 2 together.

Fred

well 'customer' is a string:

irb(main):001:0> 'customer'.class => String

and :customer is a symbol:

irb(main):002:0> :customer.class => Symbol

I don't know much about ruby, but indexing (or what is the right term) with symbols is better idea then indexing with strings. Because (in- theory at least) an object of Symbol class is smaller then an object of a String class. Try 'customer'.methods vs. :customer.methods

well 'customer' is a string:

Some Hashes in Rails are old-fashioned, and some use .with_indifferent_access. That means you can insert strings or symbols, and query symbols or strings, indifferently. This allows you to use the most natural expressions when inserting or querying.

I don't know much about ruby, but indexing (or what is the right term) with symbols is better idea then indexing with strings. Because (in- theory at least) an object of Symbol class is smaller then an object of a String class.

Symbols are converted to unique numbers at compile time, while Ruby must wait until evaluation time to convert strings into numbers. So symbols are generally faster.

Try 'customer'.methods vs. :customer.methods

Cute, but the number of methods is not a direct indicator of speed or size!

Indirectly, things with fewer methods have more opportunities for optimization, so a symbol indeed has fewer methods!

what is

the difference between @session['user'] and session[:user] ?

session['user'] when you say, there is a temporary string object created to access the session hash,

session[:user] when you say, No temporary object created here, but there is only Symbol object created at the first time of use. And from then onwards the any access to sessoin[:user] uses same Symbol object. Meaning there will be only one memory reference to symbol object.

How do I assign the cart to the logged in customer? you can do in different ways, 1. Like what you are trying to implement, Create a new Card Object, once a user logs in and assign that card_id to the logged in user's session. Then, from then onwards use that card id to add any product which plan to purchase.

2. Create Some database relation-ship between user and card model.

3. Use javascript, ajax and cookie to implement your card logic.

How do I assign the cart to the logged in customer? you can do in different ways, 1. Like what you are trying to implement, Create a new Card Object, once a user logs in and assign that card_id to the logged in user's session. Then, from then onwards use that card id to add any product which plan to purchase.

2. Create Some database relation-ship between user and card model.

3. Use javascript, ajax and cookie to implement your card logic.

OK, so I have the following tables in my db: customers, carts, cart_items. The carts table has 2 columns: id and customer_id The Customer class has: has_many : carts The Cart class has: has_many : products :through :cart_items                               has_one :customer

Also, when the customer logs in, to display his name for example, I use @c.name in the view. I'm really new to rails but from my understanding, @c is an array (is that right?) that holds all of the customer's details.

I've tried to assign the @cart to @c but it didn't work. I'm not sure how to do this. Also now, I call all the cart items by using @cart.products. How do i cahnge it to call for all the products in the cart that belongs to customer?

This is the code for customer login and logout:

def login      # examine the form data for "name" and "password"      pw,name = params[:customer].values_at(*%w{password name})      # Retrieve the customer record for the name and store it in a variable 'c'      c = Customer.find_by_name(name)      # if such record exists, and it's password matches the password from the form      if c && Digest::SHA1.hexdigest(pw) == c.password        # start a session with the customer id        @session['customer'] = c.id

        if @cart.products.empty?             redirect_to :controller => "catalog"          else          redirect_to :action => "view_cart"          end      else        # otherwise report an error        flash[:notice] = "Invalid Login"        redirect_to :controller => "catalog"      end    end

   def logout      @session['customer'] = nil      redirect_to :controller => "catalog"    end

How should I change my code to make this happen?

Thanks, Elle

sorry, i am not able to understand your schema definition. what will cart table contain? is it a mapping table?, if yes follow rails naming convention. what is the relation ship between cart, cart_items and products. ? and what does cart_item contain?

usuallly when you have has_many relationship, you can say

@customer.cart_ids = [1,2,3]

where [1,2,3] is list of cart id's which you want to associate to that user. and CustomerModel should have relationship with cart model, with name cart (name give to has_many).

you can read any any rails book to understand this relationship topic.

Good Luck.,

Thank you everyone so much for assisting me in this matter.

I changed the code so instead of having session[:customer] and session[:cart], there is only one session[:customer] with the customer's id. But now I am getting an error:

NoMethodError in CartController#login undefined method `items' for 129:Fixnum app/controllers/cart_controller.rb:17:in `login

my cart_controller.rb has the following:

Looks like you have a model named cart_items, not just items. So, it should be if @cart.cart_items.empty?

Robin