How to make logout link appear everywhere


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


<%= 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.


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'

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

before_filter :maintain_session


def maintain_session
  @current_user = User.find(session[:user_id])

That way, you can do this on your layout:

<%= link_to "Logout #{}", :controller =>
'admin', :action => 'logout' %>


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])



Otherwise an error occurs before login.


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

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]

  def logged_in?
  helper_method :logged_in?

Then in your partial:

<% if logged_in? %>
  <%= link_to "log out #{}", 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

-Dan Manges