Authlogic - 如何检查用户是否已注销

时间:2011-12-05 15:17:04

标签: ruby ruby-on-rails-3 timeout authlogic

这是我的设置:

user.rb

  acts_as_authentic do |c|
    c.logged_in_timeout(1.minutes)
  end

user_session.rb

  def to_key
    new_record? ? nil : [ self.send(self.class.primary_key) ]
  end
  self.logout_on_timeout = true

application_controller.rb

  helper_method :current_user_session, :current_user

  private
    def current_user_session
      logger.debug "ApplicationController::current_user_session"
      return @current_user_session if defined?(@current_user_session)
      @current_user_session = UserSession.find
    end

    def current_user
      logger.debug "ApplicationController::current_user"
      return @current_user if defined?(@current_user)
      @current_user = current_user_session && current_user_session.user
    end

    def require_user
      logger.debug "ApplicationController::require_user"
      unless current_user
        #store_location
        flash[:warning] = "You must be logged in to access this page"
        #redirect_to new_user_session_url
        redirect_to root_url
        return false
      end
    end

    def require_no_user
      logger.debug "ApplicationController::require_no_user"
      if current_user
        #store_location
        flash[:warning] = "You must be logged out to access this page"
        redirect_to account_url
        return false
      end
    end

但是当我加载页面时,我会收到错误

undefined method `logged_out?' for #<User:0x00000103ee8348>

我尝试阅读Authlogic的官方GitHub页面,但我仍然不知道,我想念的是什么......有人能给我一个解决方法吗?

非常感谢提前!

2 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题,归结为我的用户模型中没有所有必要的列。

我原来的用户模型(来自db/schema.rb)非常简约:

create_table "users", :force => true do |t|
    t.string   "username"
    t.string   "name"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
    t.string   "perm",               :default => "employee"
end

但是,我将列t.datetime :last_requested_at添加到我的模型中,以及可能需要或可能不需要的其他一些列。我的最终用户模型如下:

create_table "users", :force => true do |t|
    t.string   "username"
    t.string   "name"
    t.string   "crypted_password"
    t.string   "password_salt"
    t.string   "persistence_token"
    t.string   "perm",               :default => "employee"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "login_count",        :default => 0,          :null => false
    t.integer  "failed_login_count", :default => 0,          :null => false
    t.datetime "last_request_at"
    t.datetime "current_login_at"
    t.datetime "last_login_at"
    t.string   "current_login_ip"
    t.string   "last_login_ip"
end

在其他列中添加后,我不再收到undefined method 'logged_out?'...错误。

祝你好运!

(参考/更多信息:http://www.michaelhamrah.com/blog/2009/05/authlogic-and-openid-on-rails/ - 在logged_out?的页面中搜索,解释是关于帖子的3/4左右。)

答案 1 :(得分:2)

如果您想知道用户是否已注销,您可以执行以下操作:

if current_user_session
  ...

如果用户已登录(有会话),则此条件将返回true;如果他们已注销(会话为false),则此条件将返回nil

至于错误消息,undefined method 'logged_out?' for #<User:0x00000103ee8348>表示您尚未定义名为logged_out?的方法,因此它不知道您的意思。

Authlogic没有为logged_out?模型定义User方法,也没有你,所以没有什么可以调用的。原因是“登录”或“注销”的状态与User模型没有任何关系,而是与给定用户是否具有活动状态有关的属性UserSession记录。