# Sessions in Layered Dispatching

**URL:** <https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948>\
**Category:** Rails\
**Created:** [December 1, 2006, 9:20pm UTC](https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948 "2006-12-01T21:20:18Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jasonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a587f6/32.png) [@jasonb](https://www.ruby-forum.com/u/jasonb)\
**Post date:** [December 1, 2006, 9:20pm UTC](https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948/1 "2006-12-01T21:20:18Z")

</div>

Can you use sessions in layered dispatching? I used them in direct  
dispatching without any problems, but switching to layered throws an  
error (saying session doesn’t exist).

Sorry if this is a double post, Google G. isn’t posting my message  
for some reason.

---

<div class="post-metadata">

**Author:** ![jasonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a587f6/32.png) [@jasonb](https://www.ruby-forum.com/u/jasonb)\
**Post date:** [December 1, 2006, 10:12pm UTC](https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948/2 "2006-12-01T22:12:41Z")

</div>

Here is the error:

undefined local variable or method `session’ for  
#UserService:0x4818e78

Here is the UserService class:

class UserService \< ActionWebService::Base  
web\_service\_api UserApi

def login(username, password)  
logged\_in\_user = User.login(username,password)  
if logged\_in\_user  
session[:user\_id] = logged\_in\_user.id  
return true  
else  
return false  
end  
end

def get\_all\_users  
return User.find(:all)  
end  
end

---

<div class="post-metadata">

**Author:** ![jasonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a587f6/32.png) [@jasonb](https://www.ruby-forum.com/u/jasonb)\
**Post date:** [December 1, 2006, 10:39pm UTC](https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948/3 "2006-12-01T22:39:49Z")

</div>

You can pass the current controller to your service like this

class UserService \< AWS::Base  
def initialize(controller)  
@controller = controller  
end

def login  
@controller.session[…]  
end  
end

class ServiceController \< ApplicationController  
web\_service(:user) { UserService.new(controller) }  
end

Kent.

On 12/1/06, Jason B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> web\_service\_api UserApi
> 
> def get\_all\_users  
> return User.find(:all)  
> end  
> end

## – Kent

> **[DATANOISE.COM](https://www.datanoise.com/)**
>
> DATANOISE.COM - Contact us for any business inquiries

---

<div class="post-metadata">

**Author:** ![jasonb](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a587f6/32.png) [@jasonb](https://www.ruby-forum.com/u/jasonb)\
**Post date:** [December 2, 2006, 12:27am UTC](https://www.ruby-forum.com/t/sessions-in-layered-dispatching/77948/4 "2006-12-02T00:27:32Z")

</div>

Thanks!  
I did this yesterday, and I tried to raise @controller.session[:user\_id]  
and it didn’t work. Stupid mistake on my part, raise  
@controller.session[:user\_id].to\_s works much nicer 🙂

Kent S. wrote:

> You can pass the current controller to your service like this
> 
> class UserService \< AWS::Base  
> def initialize(controller)  
> @controller = controller  
> end
> 
> def login  
> @controller.session[…]  
> end  
> end
> 
> class ServiceController \< ApplicationController  
> web\_service(:user) { UserService.new(controller) }  
> end
> 
> Kent.
> 
> On 12/1/06, Jason B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > web\_service\_api UserApi
> > 
> > def get\_all\_users  
> > return User.find(:all)  
> > end  
> > end
> 
> ## – Kent
> 
> [http://www.datanoise.com](http://www.datanoise.com)
