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