2010-03-03 28 views
1

我目前正在Rails中構建一個Web應用程序。我使用Authlogic來處理正常的身份驗證。我使用facebooker處理外部網站上的Facebook連接,並在facebook畫布應用程序中對用戶進行身份驗證。Rails - Authlogic和Facebook應用程序 - 一致Current_User

我在構建簡單,一致的current_user功能時遇到了問題。目前,我有一大堆不同的方法獲取/設置當前用戶,我想盡可能簡化它。

我用我的會話active_record_store(在environment.rb中定義) 這裏是我的應用程序控制器:

class ApplicationController < ActionController::Base 

    helper :all # include all helpers, all the time 
    protect_from_forgery # See ActionController::RequestForgeryProtection for details 
    filter_parameter_logging :fb_sig_friends, :password, :password_confirmation 
    helper_method :facebook_session, :current_user_session, :current_user 

    before_filter :fb_setup 

    attr_accessor :current_user 
    helper_attr :current_user 


    #Before filter to decide if we should use facebook sessions to set current user    

    def fb_setup 
    if request_comes_from_facebook? 
     ensure_authenticated_to_facebook 
     set_current_fb_user 
    end 
    end 

    ############ 
    # AuthLogic 
    ############ 
def current_user_session 
     return @current_user_session if defined?(@current_user_session) 
     @current_user_session = UserSession.find 
end 

def current_user 
     return @current_user if defined?(@current_user) 
     @current_user = current_user_session && current_user_session.user 
end 

########## 
# Facebook 
########## 
def create_user 
self.current_user = User.for(facebook_session.user.to_i, facebook_session) 
end 

def set_current_fb_user 
self.current_user = User.for(facebook_session.user.to_i, facebook_session) 
end 

end 

而在我的用戶模型中,我有這些方法,幫助尋找/創建用戶from facebook ID: def self.for(facebook_id,facebook_session = nil) 返回find_or_create_by_facebook_id(facebook_id)do | user | 除非facebook_session.nil? user.store_session(facebook_session.session_key) 結束 結束 結束

def store_session(session_key) 
    if self.session_key != session_key 
    update_attribute(:session_key,session_key) 
    end 
end 

def facebook_session 
    @facebook_session ||= 
    returning Facebooker::Session.create do |session| 
    session.secure_with!(session_key,facebook_id,1.day.from_now) 
    end 
end 

什麼混淆這,是authlogic的方法只能獲得在需要CURRENT_USER調用,但Facebook的set_current_fb_user每請求之前調用。

我需要以一致的方式在application_controller中設置self.current_user或@current_user,無論哪個會話負責設置current_user。我在做這件事時遇到了麻煩,因此我的代碼庫的其餘部分都受到了影響。如果有人有任何建議,將不勝感激。

如果您需要任何其他信息,我會很樂意提供。

由於

回答

0

set_current_fb_user方法在每次請求調用,因爲它是從fb_setup調用,這是一個ApplicationControllerbefore_filter(和所有的控制器從ApplicationController繼承)。但是,您沒有任何總是調用current_user的方法。因此,嘗試改變before_filter行:

before_filter [:set_current_fb_user, :current_user] 

注意,如果set_current_fb_user返回一個錯誤的值,然後current_user不會被調用。

查看Rails Action Controller Guide瞭解更多信息。