user data in session or instance variable?

Firstly I'm coming from a Java EE background and building up my Rails
knowledge slowly in my (relatively limited!) free time, so apologies
if this is rudimentary stuff.

The common pattern for user sessions seems to be something like
'session[:id] = user.id' in the controller and
'User.find(session[:id])' in the view.

However its also possible to just set an instance variable once a user
has logged in, e.g. '@id = user.id'. Due to some rails magic the
instance variable of the controller gets passed to the view, thus
facilitating a kind of session persistence. I'd hazard a guess at
saying this is probably bad form but due to not fully understanding
how the instance variable is available I'm not sure.

What's the general consensus on this?

Firstly I'm coming from a Java EE background and building up my Rails
knowledge slowly in my (relatively limited!) free time, so apologies
if this is rudimentary stuff.

The common pattern for user sessions seems to be something like
'session[:id] = user.id' in the controller and
'User.find(session[:id])' in the view.

However its also possible to just set an instance variable once a user
has logged in, e.g. '@id = user.id'. Due to some rails magic the
instance variable of the controller gets passed to the view, thus
facilitating a kind of session persistence. I'd hazard a guess at
saying this is probably bad form but due to not fully understanding
how the instance variable is available I'm not sure.

The passing of instance variables from controller to view is fairly central to rails. If anything, it is doing too much in the view that is frowned upon. Personally I would do something like

@user = User.find session[:id] in the controller

And then use @user in the view

Fred

Definately @user = User.find(session[:id]) would go in the controller.

You can also make a helper called something like current_user so you
can access the user in the view without having it to set in the
controller action every time.
This makes it possible to write something like:

<%= current_user.name %> in the view.

Google stuff on Rails helpers but I normally try to not get them
bloated. Its the old saying: Fat model, skinny controller.
As Fred pointed out its frowned upon to have logic in the view.

Regards
Stefano

The real experts have already weighed in on this but I thought I would make this one comment.
ROR is in most regards stateless so while an instance variable like @user is fine to communicate from controller to view you will have to use the session variables to communicate from one controller invocation to the next.

Norm

Thanks for all your responses, yes I realise now that this is the
case. Rails documentation seems somewhat lacking but then stuff is
just so much simpler and more logical so on the whole its not a
problem.