Rails - 如何在初始化器中设置全局实例变量?

Tra*_*Liu 13 controller ruby-on-rails initializer

我正在使用预测宝石.我将推荐人初始化为initializers/predictor.rb:

require 'course_recommender'    

recommender = CourseRecommender.new

# Add records to the recommender.
recommender.add_to_matrix!(:topics, "topic-1", "course-1")
recommender.add_to_matrix!(:topics, "topic-2", "course-1")
recommender.add_to_matrix!(:topics, "topic-1", "course-2")
Run Code Online (Sandbox Code Playgroud)

然后我想在CourseController中使用推荐器,如下所示:

class CourseController < ApplicationController
  def show
    # I would like to access the recommender here.
    similiar_courses = recommender.similarities_for("course-1")
  end
end
Run Code Online (Sandbox Code Playgroud)

我怎样才能设置recommender为应用程序控制器变量,以便在控制器中访问它?

小智 41

在您的作品中,initilizers/predictor.rb您应将推荐人定义为:

recommender = CourseRecommender.new
Run Code Online (Sandbox Code Playgroud)

但是:

:: Recommender = CourseRecommender.new

这样,您可以在应用程序的整个范围内定义常量,而不是定义局部变量.在初始化程序和控制器中,您可以访问它Recommender.


Tra*_*Liu 5

我解决了这个问题。但我没有设置全局实例,而是使用单例模式。

这是代码:

# lib/course_recommender.rb
require 'singleton'
class CourseRecommender
  include Predictor::Base
  include Singleton
  # ...
end

# initializers/predictor.rb
@recommender = CourseRecommender.instance

# Add records to the recommender.
@recommender.add_to_matrix!(:topics, "topic-1", "course-1")
@recommender.add_to_matrix!(:topics, "topic-2", "course-1")
@recommender.add_to_matrix!(:topics, "topic-1", "course-2")

# controllers/course_controller.rb
require 'course_recommender'
class CourseController < ApplicationController
  def show
    similiar_courses = CourseRecommender.instance.similarities_for("course-1")
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我同意@xiy,但这突出了 Stack Exchange 站点的一个问题。他们无法区分_问题_和_问题_。这个答案解决了问题背后的_问题,但接受的答案实际上回答了这个问题(因为这个问题在被问到时假设了一种特定的解决方案)。这暴露了 Stack Exchange 站点使用的简单数据模型。 (2认同)