How to use a variable in several controllers?

Dear all,

I am a new “Ruby/Ruby on Rails” programmer. I am not sure this is the correct forum for my question. If this is not the correct forum, please indicate me a more appropriate one.

When my application implements a URL, an array, @session, is used in several methods of a first controller. The application redirects to another page, making a second controller being invoked. This controller does not use the array. When the method of the second controller ends, a layout is implicitly rendered. The layout has the following code:

<% if @session.length == 0 then %>

I got the following error message when trying to implement the URL: undefined method `length’ for nil:NilClass.

What should I do in order to the array be recognized by the second controller?

Regards,

António.

As a newcommer to rails I strongly suggest you work right through a good tutorial such as railstutorial.org (which is free to use online). That will show you the basics of rails.

As for your question are you trying to use the rails session variable? If so then it is session, not @session. If it is a variable of your own then you cannot directly pass it from one controller to another. Each request to the webserver starts from a clean slate. Remember, for example, the server could be shut down and restart between requests. You must re-calculate your variable at each request. The exception is the session variable that I mentioned which is passed, normally, via cookies.

As I said work through a good tutorial before going any further.

Colin

Whilst technically it may be possible in some situations that is certainly not the way to achieve the result you want. If it contains data that can be recalculated then possibly use a before filter. Alternatively the rails session variable may be the right way to go.

As I said, work right through a good tutorial and such things should become clear, or at least less muddy.

Colin

Controllers and their instance variables are torn down after each request; setting @session in one won’t have any effect on subsequent requests.

You may want to look into the built-in session helper, which uses signed cookies:

The Guides site overall will be very useful to you.

–Matt Jones

What you want to achieve is possible, but you are thinking about it the wrong way. Do not call it a “global variable” — that is not only the wrong word but refers to some other concept in Ruby which will not do what you think it will do.

Here’s a great introduction to sessions & cookies with a detailed beginner explanation:

http://www.theodinproject.com/ruby-on-rails/sessions-cookies-and-authentication

when you’re in a controller and you refer to session[:xyz] (see article above) that is not a local variable, but in fact a special construct by Rails to share information across web requests from the same user. It’s already implemented for you – use it, don’t re-invent the wheel.

-Jason