我需要一些在控制器中全局可访问且易于使用的类或单例对象。现在它在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
获取用户实例。
将代码放在应用程序控制器中,因为这是所有类的基类。这样一来,所有控制器都可以全局访问它。