# How switching global layout (application.rthml \<or\> custom.r

**URL:** <https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334>\
**Category:** Rails\
**Created:** [February 2, 2006, 3:08pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334 "2006-02-02T15:08:57Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Mathieu\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/958977/32.png) [@Mathieu\_C](https://www.ruby-forum.com/u/Mathieu_C)\
**Post date:** [February 2, 2006, 3:08pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334/1 "2006-02-02T15:08:57Z")

</div>

Dears,

My railsapp run using ‘/layout/application.rhtml’ and under some  
conditions ( Authenticated user, url parameter) I like to switch  
globally to another layout, let’s say custom.rhtml

Like :

class AppController \< ApplicationController  
before\_filter :context\_layout

def index  
end  
end

# application.rb

def context\_layout  
if \<context\_condition\>  
layout(‘custom’)  
end  
end

But layout() call is not available into application.rb, and writing

class AppController \< ApplicationController

layout(‘custom’)

def index  
end  
end

Works,but it’s impossible to add here test conditions like @params.

The layout method accept a conditions={} parameters, but I dont figure  
out how use it.

Thanks for helping

Mathieu

---

<div class="post-metadata">

**Author:** ![Mathieu\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/958977/32.png) [@Mathieu\_C](https://www.ruby-forum.com/u/Mathieu_C)\
**Post date:** [February 2, 2006, 3:30pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334/2 "2006-02-02T15:30:06Z")

</div>

what about this

# application.rb

def context\_layout  
if \<context\_condition\>  
@session[:layout] = ‘newlayout’  
else  
@session[:layout] = ‘oldlayout’  
end  
end

then in the top of your controllers after your before\_filter do:

layout “#{@session[:layout]}”

---

<div class="post-metadata">

**Author:** ![Mathieu\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/958977/32.png) [@Mathieu\_C](https://www.ruby-forum.com/u/Mathieu_C)\
**Post date:** [February 2, 2006, 4:09pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334/3 "2006-02-02T16:09:19Z")

</div>

Thanks Adam

That’s look pretty DRY but not works.

> then in the top of your controllers after your before\_filter do:
> 
> layout “#{@session[:layout]}”

Unless I’m a noob , @session or @params are NOT available on the  
begining of a controller. (before methods definitions) and give a nil  
exception.

Cheers,  
Mathieu

---

<div class="post-metadata">

**Author:** ![Mathieu\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/958977/32.png) [@Mathieu\_C](https://www.ruby-forum.com/u/Mathieu_C)\
**Post date:** [February 2, 2006, 4:15pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334/4 "2006-02-02T16:15:25Z")

</div>

class ApplicationController

layout :determine\_layout # symbol indicates it’s a method call in  
this case…

# …and here’s the method

def determine\_layout  
if user\_is\_logged\_in?  
“name\_of\_your\_template”  
elsif params[:whatever]  
“name\_of\_another\_template”  
else  
“default\_template\_name” # default  
end  
end  
end

… basically lifted from page 370 of the book.

On 2/2/06, Mathieu C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> removed\_email\_address@domain.invalid  
> [http://lists.rubyonrails.org/mailman/listinfo/rails](http://lists.rubyonrails.org/mailman/listinfo/rails)

–

- J \*  
~

---

<div class="post-metadata">

**Author:** ![Mathieu\_C](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/958977/32.png) [@Mathieu\_C](https://www.ruby-forum.com/u/Mathieu_C)\
**Post date:** [February 2, 2006, 4:51pm UTC](https://www.ruby-forum.com/t/how-switching-global-layout-application-rthml-or-custom-r/100334/5 "2006-02-02T16:51:44Z")

</div>

Thank you James,

> layout :determine\_layout # symbol indicates it’s a method call in  
> this case…

This way rocks,
