How to make logout link appear everywhere

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

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
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' %>

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.

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 Manges
http://www.dcmanges.com/blog