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



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

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

看起来您正在尝试创建一个标准的"当前用户"方法。我觉得你把事情搞得有点复杂。您所需要做的就是根据会话信息加载用户对象,并将其缓存在实例变量中。类似这样的东西:

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

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

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

将代码放在应用程序控制器中,因为这是所有类的基类。这样一来,所有控制器都可以全局访问它。

相关内容

  • 没有找到相关文章

最新更新