Misha Moroshko
Misha Moroshko

Reputation: 171321

Rails DRY problem: Need same code in controller and view

I have the following login check in my page:

class LoungeController < ApplicationController
  before_filter :confirm_logged_in
  def index
  end 
end

while confirm_logged_in defined here:

class ApplicationController < ActionController::Base
  protect_from_forgery

  protected

  def confirm_logged_in
    return true if current_user
    redirect_to(:controller => 'access', :action => 'login')
    return false   # halts the before_filter
  end

  def current_user
    return false unless session[:user_id]
    user = User.find(session[:user_id])
    return false unless user
    (user.display_name == session[:user_display_name]) ? user : nil
  end  
end

Now, I want to use confirm_logged_in also in app/views/layouts/application.html.erb:

<% if confirm_logged_in %>
   <div id="logged_in_as">You are logged in as <%= session[:user_display_name] %></div>
   <div id="logout"><%= link_to("Logout", {:controller => "access", :action => "logout"}, :id => "logout_link") %></div>
<% end %>

How would you suggest to solve this problem ? Where should I define confirm_logged_in ?

Upvotes: 0

Views: 229

Answers (1)

nowk
nowk

Reputation: 33161

You can use helper_method

controller.rb

helper_method :confirm_logged_in, :current_user

protected

def confirm_logged_in
  # code...
end

def current_user
  # code...
end

Upvotes: 5

Related Questions