ruby-on-rails - globales - tipos de variables en ruby
Rieles: ¿cómo establecer variables de instancia globales en inicializadores? (3)
Estaba usando la gema predictora . Inicialicé el recomendador en 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")
Y luego quería usar el recomendador en CourseController de esta manera:
class CourseController < ApplicationController
def show
# I would like to access the recommender here.
similiar_courses = recommender.similarities_for("course-1")
end
end
¿Cómo podría establecer el recommender
como una variable de controlador de aplicación para poder acceder a él en los controladores?
En tus initilizers/predictor.rb
definirás tu recomendación no como:
recommender = CourseRecommender.new
pero como:
:: Recommender = CourseRecommender.new
de esta manera, define una constante en todo el ámbito de su aplicación, en lugar de definir una variable local. En su inicializador y controlador accede a él como Recommender
.
No estoy familiarizado con esa joya, pero parece que debería tener su código en ApplicationController.
en 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")
y luego en tu controler:
class CourseController < ApplicationController
def show
# I would like to access the recommender here.
similiar_courses = @recommender.similarities_for("course-1")
end
end
Resuelvo el problema Pero en lugar de establecer una instancia global, utilizo el patrón de Singleton .
Aquí está el código:
# 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