2014-05-11 9 views
13

Użyłem klejnotu predictor. I zainicjowaniu dzia rekomendacji w initializers/predictor.rb:Railsy - jak ustawić globalne zmienne instancji w inicjalizatorach?

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

A potem chciałem użyć dzia rekomendacji w CourseController tak:

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

Jak mogę ustawić recommender jako zmienna kontrolera aplikacji, więc mogłem dostęp to w kontrolerach?

Odpowiedz

32

w twojej initilizers/predictor.rb musi zdefiniować swoją recommender nie tak:

recommender = CourseRecommender.new 

ale jak:

:: Recommender = CourseRecommender.new

ten sposób można zdefiniować stałą w całym zakresie aplikacji, zamiast definiowania zmiennej lokalnej. W inicjatorze i kontrolerze masz do niego dostęp pod numerem Recommender.

2

Nie znam tego klejnotu, ale wygląda na to, że powinieneś mieć swój kod w ApplicationController.

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

a następnie w kontroler:

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

Właśnie w celu wyjaśnienia, kod powinien iść w sterowniku, a * nie * w inicjatora. Możesz także rozważyć utworzenie filtra, jeśli jest on wymagany tylko w przypadku niektórych żądań. – zetetic

+0

Dobrze. Ale myślę, że bardziej sensowne byłoby umieszczenie kodu w inicjatorze. Dzięki i tak. –

3

Rozwiązuję problem. Ale zamiast ustawiać wystąpienie globalne, używam wzoru Singleton.

Oto kod:

# 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 
+0

To znacznie czystszy i łatwiejszy do utrzymania wzór niż zaakceptowana odpowiedź, szczególnie do testowania. – xiy