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:

http://guides.rubyonrails.org/action_controller_overview.html#session

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