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
в качестве переменной контроллера приложения, чтобы я мог получить доступ к ней в контроллерах?
Ответы
Ответ 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