application_controller.rb | 
      |
|---|---|
        class ApplicationController < ActionController::Base
  protect_from_forgery | 
    |
| 
        
         layout :detect_browser  | 
      
          helper_method :current_user
  helper_method :logged_in?
  helper_method :admin_only!
  helper_method :menu_item
  helper_method :require_user
  helper_method :set_params_page
  helper_method :show_layout?
  helper_method :pjax_request?
  helper_method :title
  helper_method :set_pagination_buttons
  protected | 
    
| 
        
         This incredibly useful helper gives us the currently logged in user. We keep track of that by just setting a session variable with their id. If it doesn’t exist, we just want to return nil.  | 
      
          def current_user
    return unless session[:user_id]
    @current_user ||= User.first(:id => session[:user_id])
  end | 
    
| 
        
         This very simple method checks if we’ve got a logged in user. That’s pretty easy: just check our current_user.  | 
      
          def logged_in?
    current_user
  end | 
    
| 
        
         Our   | 
      
          def admin_only!(opts = {:return => "/"})
    redirect_with_sorry(opts) unless logged_in? && current_user.admin?
  end | 
    
| 
        
         Similar to   | 
      
          def require_login!(opts = {:return => "/"})
    redirect_with_sorry(opts) unless logged_in?
  end
  def menu_item(name, url, options = {})
    icon = options.fetch(:icon){ false }
    classes = options.fetch(:classes){ [] }
    rel = options.fetch(:rel){ false }
    classes << name.downcase.gsub(" ", "_")
    classes << (request.path_info == url ? "active" : "")
    "<li class='#{classes.join(" ")}'>
      <a href='#{url}'" + (rel ? " rel='#{rel}'" : "") + ">" +
      (icon ? "<div class='icon'></div>" : "") +
      "#{name}</a>
    </li>"
  end
  def require_user
    redirect_to root_path unless current_user
  end | 
    
| 
        
         Many pages on rstatus are paginated. To keep track of it in all the different routes we have this handy helper that either picks up the previous setting or resets it to a default value.  | 
      
          def set_params_page
    params[:page]     = params.fetch("page"){1}.to_i
    params[:per_page] = params.fetch("per_page"){20}.to_i
  end | 
    
| 
        
         Similar to the set_params_page helper this one creates the links for the previous and the next page on all routes that display stuff on more than one page. If needed it can also take options for more parameters  | 
      
          def set_pagination_buttons(data, options = {})
    return if data.blank?
    %w[next previous].each do |type|
      if data.send("#{type}_page")
        params = {
          :page     => data.send("#{type}_page"),
          :per_page => data.per_page
        }.merge(options)
        instance_variable_set(:"@#{type}_page", "?#{Rack::Utils.build_query params}")
      end
    end
  end
  def title(str)
    @title = str
    pjax_request? ? @title : nil
  end
  def pjax_request?
    env['HTTP_X_PJAX']
  end
  def show_layout?
    !pjax_request?
  end
private
  MOBILE_BROWSERS = ["android", "ipod", "opera mini", "blackberry", "palm","hiptop","avantgo","plucker", "xiino","blazer","elaine", "windows ce; ppc;", "windows ce; smartphone;","windows ce; iemobile", "up.browser","up.link","mmp","symbian","smartphone", "midp","wap","vodafone","o2","pocket","kindle", "mobile","pda","psp","treo"]
  def detect_browser
    agent = request.headers["HTTP_USER_AGENT"].downcase
    if MOBILE_BROWSERS.find { |m| agent.match(m) }
      'mobile'
    else
      'application'
    end
  end
  def redirect_with_sorry(opts)
    flash[:error] = "Sorry, buddy"
    redirect_to opts[:return]
  end
end |