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.