Подтвердить что ты не робот

Rails - Как установить глобальные переменные экземпляра в инициализаторах?

Я использовал predictor gem. Я инициализировал рекомендацию в 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")

И тогда я хотел использовать рекомендацию в CourseController следующим образом:

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

Как я мог установить recommender в качестве переменной контроллера приложения, чтобы я мог получить доступ к ней в контроллерах?

4b9b3361

Ответ 1

В своем initilizers/predictor.rb вы должны указать своего рекомендателя не как:

recommender = CourseRecommender.new

но как:

:: Рекомендатор = CourseRecommender.new

таким образом вы определяете константу во всей области приложения, а не определяете локальную переменную. В вашем инициализаторе и контроллере вы получаете доступ к нему как Recommender.

Ответ 2

Я не знаком с этим камнем, но похоже, что у вас должен быть код в ApplicationController.

в ApplicationController:

@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")

а затем в вашем контроллере:

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

Ответ 3

Я решаю проблему. Но вместо установки глобального экземпляра я использую шаблон Singleton.

Здесь код:

# 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