我想在/lib
中的文件中创建一个类的全局实例。我可以访问这个类并在我的控制器中初始化它,如下所示:
message_queue = MessageQueue.new
然而,我希望有一个全局版本,只要rails会话正在运行,它就会一直存在(这是一个实验。我不想为此使用模型)。
我通过执行以下操作初始化application.rb
中的变量:
config.autoload_paths << Rails.root.join('lib')
以便它们是全局的,以确保可以找到类。然而,当我初始化变量时,我得到了一个错误:uninitialized constant RPG::Application::MessageQueue (NameError)
。
如何使MessageQueue
的实例成为可以在任何地方访问的全局变量?
首先,通过使用类名的snake_case版本,确保ruby文件的名称与类名匹配(你的文件应该被称为lib/message_queue.rb)。这是rails自动加载器正确要求和加载文件的要求,并允许你从其他类轻松调用它
要使您的类"全局",请考虑在MessageQueue类上实现singleton模式?
Ruby有一个内置模块Singleton,您可以将其包含在类中,这样可以确保只能实例化该类的一个实例。http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html
对于任何试图让它发挥作用的人,请执行以下操作:
-
在/lib中的文件中创建类。确保名称匹配(MessageQueue类位于message_queue.rb文件中)。
-
然后在models文件夹中创建一个文件。可以称之为globals.rb。这是创建类的全局实例的地方。把这个放在文件中:
module Globals instance = MessageQueue end
(很明显,可以随心所欲地调用类,也可以调用实例。
-
像这样访问您的全局实例:
Globals::instance
-
请注意,此实例仅在服务器运行时才有效。如果停止服务器,全局实例中的所有信息都将丢失。