Archive

Posts Tagged ‘session’

model中使用session

May 25th, 2010 yakjuly No comments

rails中model访问session的两种办法。

方法1:一劳永逸
share_session/init.rb

require 'share_session'
ActiveRecord::Base.class_eval {include ShareSession::Model}
ActionController::Base.class_eval {include ShareSession::Controller}

share_session/lib/share_session.rb

module ShareSession

  module Model
    def self.included(base)
      base.extend ClassMethods
    end

    module ClassMethods
      attr_accessor :get_session_proc

      def model_session
        ActiveRecord::Base.get_session_proc if ActiveRecord::Base.get_session_proc
      end
    end
  end

  module Controller
    def self.included(base)
      base.prepend_before_filter :set_session_for_model
    end

    def set_session_for_model
      ActiveRecord::Base.get_session_proc = send(:session)
    end
  end

end

方法2: 只取所需
利用给类实例变量赋值共享数据。

models/user.rb

class User < ActiveRecord::Base
  def self.current=(user)
    @current_user = user
  end

  def self.current
    @current_user ||= User.anonymous
  end
end

application_controller.rb

class ApplicationController < ActionController::Base
  before_filter :user_setup, :check_if_login_required

  def user_setup
    # Check the settings cache for each request
    Setting.check_cache
    # Find the current user
    self.logged_user = find_current_user
  end

  # Returns the current user or nil if no user is logged in
  def find_current_user
    if session[:user_id]
      # existing session
      (User.active.find(session[:user_id]) rescue nil)
    elsif cookies[:autologin] && Setting.autologin?
      # auto-login feature
      User.try_to_autologin(cookies[:autologin])
    elsif params[:key] && accept_key_auth_actions.include?(params[:action])
      # RSS key authentication
      User.find_by_rss_key(params[:key])
    end
  end

  # Sets the logged in user
  def logged_user=(user)
    if user && user.is_a?(User)
      User.current = user
      session[:user_id] = user.id
    else
      User.current = User.anonymous
      session[:user_id] = nil
    end
  end
end
Categories: rails Tags: ,