我需要一些可在控制器中全局访问的类或单例对象,并且易于使用。现在它在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
此代码显然不好,因为用户在应用程序启动时只初始化一次,如果使用不当,用户将不会更新。我希望在没有太多添加步骤的情况下保存使用类或对象的能力,但是为每个新连接都有一个新的全局实例。应该如何做?
答案 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 中,因为这是所有类的基类。这样做也可以在所有控制器中全局访问。