# How to make logout link appear everywhere

**URL:** <https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098>\
**Category:** Rails\
**Created:** [September 20, 2008, 11:09am UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098 "2008-09-20T11:09:43Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [September 20, 2008, 11:09am UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098/1 "2008-09-20T11:09:43Z")

</div>

Hi,  
When users are logged in, they should always have a ‘Logout’ function  
handy  
somewhere.

Users control Forms and Elements using two controllers, FormsController  
and  
ElementsController.

What at least works is to add the following lines to the end of both  
layout  
files.

views/layouts/elements.erb.html and  
views/layouts/forms.erb.html

* * *
\<%= link\_to "Logout #{User.find(session[:user\_id]).name}", :controller =\> 'admin', :action =\> 'logout' %\>

This gives me two issues.

- I’m putting business logic in the View.
- I’m putting this line across two files.

CmdJohnson

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [September 20, 2008, 12:32pm UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098/2 "2008-09-20T12:32:58Z")

</div>

Put it in a layout (app/views/layout)

- if logged\_in?  
= link\_to “Logout #{current\_user.login}”, logout\_path

These layouts are used when a controller is told to use them via:  
layout ‘layoutname’

On Sat, Sep 20, 2008 at 5:09 PM, Commander J.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> * * *
> \<%= link\_to "Logout #{User.find(session[:user\_id]).name}", :controller =\> 'admin', :action =\> 'logout' %\> This gives me two issues. - I'm putting business logic in the View. - I'm putting this line across two files. CmdJohnson \>

–  
Ramon T.

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [September 20, 2008, 12:49pm UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098/3 "2008-09-20T12:49:58Z")

</div>

On Sep 20, 5:09 pm, “Commander J.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> views/layouts/elements.erb.html and
> 
> - I’m putting this line across two files.
> 
> CmdJohnson

I agree with Ramon. Also, I suggest you put the following in your  
application.rb:

before\_filter :maintain\_session

protected

def maintain\_session  
@current\_user = User.find(session[:user\_id])  
end

That way, you can do this on your layout:

\<%= link\_to “Logout #{@current\_user.name}”, :controller =\>  
‘admin’, :action =\> ‘logout’ %\>

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [September 20, 2008, 1:36pm UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098/4 "2008-09-20T13:36:50Z")

</div>

Erol,  
Thanks for that snippet. This is what I made of it:

def maintain\_session  
if session[:user\_id]  
@current\_user = User.find(session[:user\_id])  
end  
end

Otherwise an error occurs before login.

Ramon,

I don’t understand yet how this will apply to both the FormsController  
and  
ElementsController.

---

<div class="post-metadata">

**Author:** ![Commander\_J](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/a8b319/32.png) [@Commander\_J](https://www.ruby-forum.com/u/Commander_J)\
**Post date:** [September 21, 2008, 7:24am UTC](https://www.ruby-forum.com/t/how-to-make-logout-link-appear-everywhere/149098/5 "2008-09-21T07:24:58Z")

</div>

Many apps use app/views/layouts/application.html.erb as a layout that  
applies to the website globally. If you do want separate layouts for  
your two controllers, I would create a logout partial. You could do  
it by making a file app/views/shared/\_logout.html.erb that contains  
your logout link. Then from your two other layouts you would have to  
do: \<%= render :partial =\> “shared/logout” %\>

Regarding the controller, you would need to put the suggested  
before\_filter in the application.rb controller so that it runs for any  
controller. I would expand the logic a little bit. Probably something  
like this:

class ApplicationController  
before\_filter :find\_current\_user

def find\_current\_user  
@current\_user = User.find(session[:user\_id]) if session[:user\_id]  
end

def logged\_in?  
!session[:user\_id].nil?  
end  
helper\_method :logged\_in?  
end

Then in your partial:

\<% if logged\_in? %\>  
\<%= link\_to “log out #{@current\_user.name}”, logout\_path  
\<% end %\>

For logout\_path to be available, you’ll need to be using named routes.  
If you’re not comfortable doing that in Rails yet, you could  
use :controller =\> ‘admin’, :action =\> ‘logout’ like you originally  
had.

-Dan M.  
[http://www.dcmanges.com/blog](http://www.dcmanges.com/blog)

On Sep 20, 6:36 am, “Commander J.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
