【问题标题】:Rails custom classRails 自定义类
【发布时间】:2015-12-15 18:54:22
【问题描述】:

我想在/lib 的文件中创建一个类的全局实例。我可以像这样访问这个类并在我的控制器中初始化它:

message_queue = MessageQueue.new

但是,我希望有一个全局版本,只要 rails 会话正在运行(这是一个实验。我不想为此使用模型)。

我通过以下方式在application.rb 中初始化了变量:

config.autoload_paths << Rails.root.join('lib')

这样它们是全局的,以确保可以找到该类。但是,我在初始化变量时收到错误:uninitialized constant RPG::Application::MessageQueue (NameError)

如何使MessageQueue 的实例成为我可以在任何地方访问的全局变量?

【问题讨论】:

  • 什么是“全局实例”?
  • 您是否在application.rb 中包含MessageQueue 类?

标签: ruby-on-rails ruby ruby-on-rails-3 class global-variables


【解决方案1】:

首先,确保 ruby​​ 文件的名称与类的名称匹配,方法是使用类名称的 snake_case 版本(您的文件应该称为 lib/message_queue.rb)。这是 rails 自动加载器正确请求和加载文件的要求,并允许您从其他类轻松调用它

要使您的类“全球化”,请查看在 MessageQueue 类上实现单例模式?

Ruby 有一个内置模块 Singleton,您可以将其包含在您的类中,这将确保只能实例化该类的一个实例。 http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html

【讨论】:

  • 文件名匹配。我最终将类文件留在 lib 中,并使用它自己的模块“globals”在模型中的文件中实例化它,然后像这样调用它:Globals::message_query_instance。效果很好。我可能会补充一点,这仅在服务器运行时才有效,这在我的情况下是有意的。不过感谢您的帮助。我一定会检查单例模块:)
【解决方案2】:

对于任何试图使其工作的人,请执行以下操作:

  1. 在 /lib 的文件中创建您的类。确保名称匹配(MessageQueue 类位于文件 message_queue.rb 中)。

  2. 然后在模型文件夹中创建一个文件。称它为 globals.rb 之类的东西。这是您将创建类的全局实例的地方。将其放入文件中:

    module Globals instance = MessageQueue end

(显然,你可以随意调用你的类和实例。

  1. 像这样访问您的全局实例:Globals::instance

  2. 请注意,此实例仅在您的服务器运行时才存在。如果您停止服务器,全局实例中的所有信息都将丢失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多