# Session

**URL:** <https://www.ruby-forum.com/t/session/88386>\
**Category:** Rails\
**Created:** [March 10, 2007, 1:21pm UTC](https://www.ruby-forum.com/t/session/88386 "2007-03-10T13:21:35Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 10, 2007, 1:21pm UTC](https://www.ruby-forum.com/t/session/88386/1 "2007-03-10T13:21:35Z")

</div>

Hello !  
I have bought book Agile web development with Ruby on Rails and i have  
come to the section: sessions.

I am having some problems figuring out what does each line of code do.  
So i would be gratefull if somoeone would explain it to me.

First I have this:

session[:cart] ||= Cart.new

Ok i understand the second part which creates new if there isnt an  
existing one. but the firt part is what i dont understand.

session[:cart]

:cart is because of the name of the model cart.rb ?  
Can i add more models ? Something like session[:cart, :person] ?

One more thing i dont understand is this line

product=Product.find(params[:id])

in add\_to\_cart function.  
I understand in general that it finds the id but where can i find more  
documentation about params and how it is used ?

I have a link [http://api.rubyonrails.org/](http://api.rubyonrails.org/) but it seems to me like it  
isnt full ? I check for params cant find it, check for session  
something small and unusuable…

Please help me ! I want to learn but im stuck ☹

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 10, 2007, 1:39pm UTC](https://www.ruby-forum.com/t/session/88386/2 "2007-03-10T13:39:35Z")

</div>

Hi Eric,

Product.find(params[:id]) selects the record whose primary key value  
matches the id passed in the parameters.

So, if your url looks like [http://railsapp/product/show/1](http://railsapp/product/show/1),  
params[:id] would be 1, and the corresponding record gets selected.

The symbol, :cart isn’t used because it matches the name of the  
model. You can use any name for the session variables and can also  
save multiple values in a session.

Chaitanya

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 10, 2007, 2:05pm UTC](https://www.ruby-forum.com/t/session/88386/3 "2007-03-10T14:05:37Z")

</div>

Thank you very much fr your fast reply.  
Could you tell me the correct syntax for saving multiple values to a  
session ?

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 10, 2007, 4:03pm UTC](https://www.ruby-forum.com/t/session/88386/4 "2007-03-10T16:03:59Z")

</div>

Do you know where can i check this ?  
I havent find any good documentation on session ☹

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 10, 2007, 2:15pm UTC](https://www.ruby-forum.com/t/session/88386/5 "2007-03-10T14:15:39Z")

</div>

Though, I’ve used sessions till now, I’m confident that you could do  
something like this…

session[:user] = User.find(‘eric’)  
session[:cart] = Cart.find\_and\_add(‘item1’)

- Chaitanya

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 11, 2007, 12:11am UTC](https://www.ruby-forum.com/t/session/88386/6 "2007-03-11T00:11:26Z")

</div>

It is not a good practice to save objects into the session for several  
reasons. One is that you are unnecessarily impacting the performance,  
you  
also will run into problems when you have changed your model but the  
sessions consists of the older version models, which is very difficult  
to  
debug.

So instead of storing the object you can store the id of the object in  
the  
session.

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 11, 2007, 12:20am UTC](https://www.ruby-forum.com/t/session/88386/7 "2007-03-11T00:20:26Z")

</div>

[http://api.rubyonrails.com/classes/ActionController/SessionManagement/ClassMethods.html](http://api.rubyonrails.com/classes/ActionController/SessionManagement/ClassMethods.html)  
describes the available session methods.

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 11, 2007, 2:20am UTC](https://www.ruby-forum.com/t/session/88386/8 "2007-03-11T02:20:46Z")

</div>

Eric wrote:

> Do you know where can i check this ?  
> I havent find any good documentation on session ☹

Eric,  
While some of the documentation says it is only similar, in general use  
you can think of the session as a simple Hash object. With any hash  
object, you can add stuff to it for a new key by simply doing something  
like:

my\_hash = hash.New  
my\_hash[:foo] = “bar”  
my\_hash[:everything] = 42

same is true for the “session hash”  
session = hash.New  
session[:foo] = “bar”  
session[:everything] = 42  
session[:my\_blog\_entry] = this\_blog\_entry.id

You can make these keys up at will and add them as above. The  
usefulness of the session hash is that stuff you put in there is  
“remembered” from one action to another and also from one controller to  
another. Wherever your user goes in the app, his session data goes with  
him. Because of the way http works, this is not true for a simple  
global variable. So, whenever you need to “remember” something outside  
the boundaries of a single action in a single controller, you need to  
save it (or a reference to it, such as an “id” that can be found later)  
in the session “hash” as shown above.

hth,  
jp

---

<div class="post-metadata">

**Author:** ![eric](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/e/898d66/32.png) [@eric](https://www.ruby-forum.com/u/eric)\
**Post date:** [March 11, 2007, 2:22am UTC](https://www.ruby-forum.com/t/session/88386/9 "2007-03-11T02:22:37Z")

</div>

Jeff P. wrote:

> same is true for the “session hash”  
> session = hash.New  
> session[:foo] = “bar”

oops, stupid mistake. You don’t create a new session hash with  
hash.new, you just use the session object created by rails. I copied  
that and pasted it below and forgot to remove that line.

jp
