2014-05-11 17 views
13

Tôi đã sử dụng đá quý predictor. Tôi khởi sự recommender trong initializers/predictor.rb:Rails - Làm thế nào để thiết lập các biến mẫu toàn cục trong initializers?

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

Và sau đó tôi muốn sử dụng recommender trong CourseController như thế này:

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

Làm thế nào tôi có thể thiết lập recommender như là một biến điều khiển ứng dụng để tôi có thể truy cập nó trong bộ điều khiển?

Trả lời

32

Trong bạn initilizers/predictor.rb bạn phải xác định recommender của bạn không phải là:

recommender = CourseRecommender.new 

nhưng như:

:: Recommender = CourseRecommender.new

cách này bạn định nghĩa một hằng số trong suốt phạm vi áp dụng của bạn, thay vì xác định một biến địa phương. Trong bộ khởi tạo và bộ điều khiển của bạn, bạn truy cập nó như Recommender.

2

Tôi không quen thuộc với đá quý đó, nhưng có vẻ như bạn nên có mã của bạn trong ApplicationController.

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

và sau đó trong ứng dụng điều khiển của bạn:

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

Chỉ cần làm rõ, mã nên đi vào bộ điều khiển, và * không * trong initializer. Bạn cũng có thể xem xét biến nó thành bộ lọc nếu nó chỉ được yêu cầu cho một số yêu cầu nhất định. – zetetic

+0

Phải. Nhưng tôi nghĩ nó có ý nghĩa hơn khi đặt mã trong bộ khởi tạo. Dù sao cũng cảm ơn bạn. –

3

Tôi giải quyết được sự cố. Nhưng thay vì thiết lập một trường hợp toàn cục, tôi sử dụng mẫu Singleton.

Dưới đây là các mã:

# 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

Đây là một mẫu sạch hơn và dễ bảo trì hơn so với câu trả lời được chấp nhận, đặc biệt là để thử nghiệm. – xiy

Các vấn đề liên quan