0

我需要一些可在控制器中全局访问且易于使用的类或单例对象。现在它在这样的libs/文件夹中实现:

class User
  class << self

    @user = nil
    attr_reader :uid, :name

    def init session
      if session[:user_info].nil?
        @user = nil
      end

      @user = session_data[:user]
    end

    def signed_in?
      @user.nil? ? false : true
    end

    def guest?
      not signed_in?
    end

  end
end

这段代码显然不好,因为用户只在应用程序启动时初始化一次,如果使用不当,用户将不会被更新。我想保存使用类或对象的能力,而无需太多附加步骤,但每个新连接都有一个新的全局实例。应该怎么做?

4

3 回答 3

1

您可以添加include Singleton到您的用户类定义,然后使用User.instancego 获取用户实例。

于 2013-02-08T08:30:38.710 回答
1

看起来您正在尝试创建标准的“当前用户”方法。我认为你使事情复杂化了一点。您需要做的就是根据会话信息加载用户对象并将其缓存在实例变量中。像这样的东西:

class ApplicationController < ActionController::Base
  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end
end

第一次调用它时,它会根据会话中存储的 ID 查找当前用户。后续调用将返回您已加载的用户对象。如果用户未登录,current_user将只是nil.

于 2013-02-08T10:40:21.820 回答
0

将代码放在Application Controller中,因为这是所有类的基类。这样做也可以在所有控制器中全局访问。

于 2013-02-08T08:41:17.143 回答