Refactoring method in ApplicationController for Rails App
I would solve this with a combination of inheritance and duck typing. 


Use a base method on a User class root_path to be your entry point. 
Pull out that nasty "signed out" user concept to a NullUser object, it is safer than passing nils around or constantly calling user_signed_in? everywhere.
Delegate from the root_path method in the base class to specific_root_path in subclasses once you are past your "early exit" logic.




# application_controller.rb

class ApplicationController &lt; ActionController::Base
  before_filter :set_current_user

  def user_root_path
    @user.root_path
  end

  def set_current_user
    @user = current_user
    @user ||= NullUser.new
  end
end




# user.rb

class User &lt; ActiveRecord::Base
  include Rails.application.routes.url_helpers

  def admin?
    # your admin logic
  end

  def root_path
    return admin_root_url  if self.admin?
    return school_admin_athletes_path if self.role?("School Admin") 
    if self.athlete_contributor? &amp;&amp;
      !self.class.name.eql?("Athlete")
      return contributor_dashboard_url
    end

    specific_root_path
  end

  def specific_root_path
    root_url
  end
end

class NullUser
  include Rails.application.routes.url_helpers

  def root_path
    root_url
  end
end




# athlete.rb

class Athlete &lt; User

  def specific_root_path
    if self.username.present?
      edit_vitals_athlete_profile_path
    else
      account_finalize_path
    end
  end

end




# high_school_coach.rb

class HighSchoolCoach &lt; User

  def specific_root_path
    school_admin_athletes_path
  end

end




# college_coach.rb

class CollegeCoach &lt; User
  def specific_root_path
    if self.sports.blank? || self.college_id.blank?
      account_finalize_path
    else
      search_index_path
    end
  end
end




This logic should be equivalent to your original logic, if it isn't, it is pretty close.