tipos globales ruby-on-rails controller initializer

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