# http session nil

**URL:** <https://discuss.rubyonrails.org/t/http-session-nil/62092>\
**Category:** rubyonrails-talk\
**Created:** [December 23, 2011, 7:10am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092 "2011-12-23T07:10:01Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![sachin2](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@sachin2](https://discuss.rubyonrails.org/u/sachin2)\
**Post date:** [December 23, 2011, 7:10am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/1 "2011-12-23T07:10:01Z")

</div>

hi all, i am new in ruby on rails,i have one issue regarding the session in ruby on rails.I am using session , i have following condition in my rhtml

\<%if @session[‘user’].first\_name == “admin”%\>

but this ‘session’ is coming nil.i tried by setting

config.action\_controller.session = { :key =\> “\_suggestica\_admin\_session”, :secret =\> “80a6825007749a785439ca8d3ff54ac37a16acefea4788fa8c9ac8e69aef11eb7f3b06ab6e8d4a0e5023fb8e8a22ea197ee74828e16d8ab7e3e130fd0da7bea5” }

this in environment.rb also tried setting value in session\_store.rb

ActionController::Base.session = { :key =\> ‘\_suggestica\_admin\_session’, :secret =\> ‘35659c1f21207ecfeaf30aa32b72c717158eae4c41e665b7a31b26fc021890be31c8ed961cf695384030d34e3f3d0c8788d4733aac393e4003e077317c930b57’ }

but this also didn’t work

can any one know how to set the session for Rails 2.3.11 and gem version:1.6.2 and Ruby 1.8.7 on Windows as O.S

---

<div class="post-metadata">

**Author:** ![Gautam\_Pai](https://avatars.discourse-cdn.com/v4/letter/g/f14d63/32.png) [@Gautam\_Pai](https://discuss.rubyonrails.org/u/Gautam_Pai)\
**Post date:** [December 23, 2011, 7:19am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/2 "2011-12-23T07:19:35Z")

</div>

In rails session data is accessible only in controller. And thats how its meant to be according to MVC.

If you really need it in view you need to set an instance variable in controller and use it in view. But thats very bad and not supposed to be done. If you are accessing session data in views, i think you need to rethink your design to be more inline with mvc pattern.

Gautam Pai

---

<div class="post-metadata">

**Author:** ![sachin2](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@sachin2](https://discuss.rubyonrails.org/u/sachin2)\
**Post date:** [December 23, 2011, 7:57am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/3 "2011-12-23T07:57:02Z")

</div>

thanks Gautam for your reply. can you tell , how to set that session in where ?

---

<div class="post-metadata">

**Author:** ![Michael\_Pavling](https://avatars.discourse-cdn.com/v4/letter/m/8dc957/32.png) [@Michael\_Pavling](https://discuss.rubyonrails.org/u/Michael_Pavling)\
**Post date:** [December 23, 2011, 9:11am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/4 "2011-12-23T09:11:10Z")

</div>

> In rails session data is accessible only in controller. And thats how its meant to be according to MVC.

Really... based on the evidence of all the crappy apps I keep inheriting, that's not correct. The session is perfectly accessible from the views (although you're right - it \*should\* be avoided)

> If you really need it in view you need to set an instance variable in controller and use it in view.

If you look again at the code in the OP, you'll see it's trying to be accessed as an instance variable - which almost certainly hasn't been set. If the OP wants to just change : &nbsp;&nbsp;@session['user'].first\_name to &nbsp;&nbsp;session['user'].first\_name

...it may miraculously start working.

Two things...

a) Please don't store whole objects in session. It's really stinky. Store the id, and reload it with each request. b) Rather than the repetition of accessing session["user"] attributes everywhere. Set a helper method in the application controller which returns the current user (or use an authentication Gem that does it for you) Something like: &nbsp;&nbsp;def current\_user &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@current\_user ||= User.find(session[:user\_id]) &nbsp;&nbsp;end

Then set up methods in your user class to manage permissions (to make them easier to manage). &nbsp;&nbsp;# user.rb &nbsp;&nbsp;def has\_admin\_rights? &nbsp;&nbsp;&nbsp;&nbsp;first\_name == "admin" &nbsp;&nbsp;end

&nbsp;&nbsp;# view &nbsp;&nbsp;\<%if current\_user.has\_admin\_rights? %\> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<table width="290" border="0" height="20" align="right" cellspacing="0" cellpadding="0"\>

...see how it makes the code in the view more "self documenting"...

Also, look at abstracting things like roles (admin, user, guest, etc) and statuses (awaiting\_validation, active, retired) to state machines rather than "magic-number" text comparisons on first-name fields :-/

HTH

---

<div class="post-metadata">

**Author:** ![sachin2](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@sachin2](https://discuss.rubyonrails.org/u/sachin2)\
**Post date:** [December 23, 2011, 11:45am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/5 "2011-12-23T11:45:32Z")

</div>

thanks Michael for responding,my question is how that http session is set in ruby on rail ? because in following code ‘@session’ is coming nil :

\<%if @session != nil%\> \<%else%\> \<%if @session[‘user’].first\_name == “admin”%\>

```
      <table width="290" border="0" height="20" align="right" cellspacing="0" cellpadding="0">
   <%end%>

```

\<%end%\>

---

<div class="post-metadata">

**Author:** ![Michael\_Pavling](https://avatars.discourse-cdn.com/v4/letter/m/8dc957/32.png) [@Michael\_Pavling](https://discuss.rubyonrails.org/u/Michael_Pavling)\
**Post date:** [December 23, 2011, 11:48am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/6 "2011-12-23T11:48:58Z")

</div>

As I said.... "session" is \*not\* an instance variable. So remove the "@" sign...

---

<div class="post-metadata">

**Author:** ![sachin2](https://avatars.discourse-cdn.com/v4/letter/s/e480ec/32.png) [@sachin2](https://discuss.rubyonrails.org/u/sachin2)\
**Post date:** [December 23, 2011, 11:58am UTC](https://discuss.rubyonrails.org/t/http-session-nil/62092/7 "2011-12-23T11:58:27Z")

</div>

thanks Michael,really thanks it solved my problem.
