model中使用session
May 25th, 2010
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