2014-05-11 5 views
13

Stavo usando la gemma predictor. Ho inizializzato il recommender in initializers/predictor.rb:Rails - Come impostare le variabili di istanza globali negli inizializzatori?

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

E poi ho voluto usare il recommender nel CourseController come questo:

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

Come ho potuto impostare recommender come variabile di controllo applicazione in modo ho potuto accedere nei controller?

risposta

32

Nella tua initilizers/predictor.rb si definisce il vostro recommender non come:

recommender = CourseRecommender.new 

ma come:

:: Recommender = CourseRecommender.new

questo modo si definisce una costante per tutto l'ambito della vostra applicazione, invece di definire una variabile locale. Nel tuo inizializzatore e controller lo accedi come Recommender.

2

Non ho familiarità con quella gemma, ma sembra che dovresti avere il tuo codice in ApplicationController.

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

e poi nel vostro controler:

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

Giusto per chiarire, il codice dovrebbe andare nel controller, e * non * nella inizializzazione. Si potrebbe anche prendere in considerazione la creazione di un filtro se è richiesto solo per determinate richieste. – zetetic

+0

Giusto. Ma penso che abbia più senso inserire il codice in un inizializzatore. Grazie comunque. –

3

Ho risolto il problema. Ma invece di impostare un'istanza globale, io uso il modello Singleton.

Ecco il codice:

# 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

Questo è uno schema molto più pulito e più gestibile rispetto alla risposta accettata, soprattutto per i test. – xiy