如何在rails中创建和使用全局静态类/单例?

时间:2013-02-08 08:16:08

标签: ruby ruby-on-rails-3 singleton

我需要一些可在控制器中全局访问的类或单例对象,并且易于使用。现在它在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

此代码显然不好,因为用户在应用程序启动时只初始化一次,如果使用不当,用户将不会更新。我希望在没有太多添加步骤的情况下保存使用类或对象的能力,但是为每个新连接都有一个新的全局实例。应该如何做?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分:0)

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