1

我目前正在 Rails 中构建一个 Web 应用程序。我正在使用 Authlogic 来处理正常的身份验证。我正在使用 facebooker 处理外部站点上的 facebook 连接并在 facebook 画布应用程序中验证用户。

我在构建简单、连贯的 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

在我的用户模型中,我有这些方法来帮助从 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) end end end

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

令人困惑的是,仅当需要 current_user 时才调用 authlogic 的方法,但在每次请求之前调用 facebook 的 set_current_fb_user。

无论哪个会话负责设置 current_user,我都需要以连贯的方式在 application_controller 中设置 self.current_user 或 @current_user。我在做这件事时遇到了麻烦,我的代码库的其余部分也因此而受苦。如果有人有任何建议,将不胜感激。

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

谢谢

4

1 回答 1

0

每次请求都会调用该set_current_fb_user方法,因为它是从 调用的fb_setup,它是一个before_filterof ApplicationController(并且所有控制器都继承自ApplicationController)。但是,您没有任何before_filter方法总是调用current_user. 因此,尝试将before_filter行更改为:

before_filter [:set_current_fb_user, :current_user]

请注意,如果set_current_fb_user返回 false 值,则current_user不会被调用。

有关详细信息,请参阅Rails 动作控制器指南

于 2010-03-04T00:09:02.953 回答