Rails - 如何从控制器访问初始化程序中生成的数据

时间:2017-08-09 21:53:14

标签: ruby-on-rails variables singleton initializer rufus-scheduler

我在rails应用程序上有一个ruby,我使用AWS Products API。这个api有一个油门。所以我使用rufus scheduler gem设置一个调度程序来每秒查询一次api,n次。我把调度程序放在初始化程序中,因为我想尽快获取数据。但我很难成功地从控制器访问数据。我设置了一个带有类变量的单例类,并为它设置了getter和setter。它在当地完美运作。但是当我在prod中运行它时,类变量是空的。 (我尝试了一个实例变量,但在setter中得到了nil)我迷路了,可以使用一些帮助。

这是我的代码:

aws_products.rb

require 'singleton'
require 'asin'

class AWSProducts
    include Singleton
    include ASIN::Client

    @@product_rewards = []

    def product_rewards
       @@product_rewards
    end
    def add_product_rewards(array)
       unless array.nil?
          @@product_rewards.concat array
       end
    end

    def get_aws_products (keywords, page)
      ...
    end
end

scheduler.rb

require 'rufus-scheduler'
require 'aws_products'

scheduler = Rufus::Scheduler.singleton
@aws = AWSProducts.instance

product_count = 0

scheduler.every '1s', :blocking => true do |job|
    if product_count <= 5
        @aws.add_product_rewards( @aws.get_aws_products('Best Sellers', product_count) )
        product_count += 1
    else
        job.unschedule
    end
end

application_controller.rb

require 'aws_products'
class ApplicationController < ActionController::Base
    def popular_products
        blacklist = Blacklist.all
        logger.info AWSProducts.instance.product_rewards.inspect
        @items = AWSProducts.instance.product_rewards.select{ |item| !blacklist.any?{ |o| item[:id].to_s == o.identifer } }
    end
end

编辑:我在AWS Elastic Beanstalk上托管并通过eb cli进行部署

1 个答案:

答案 0 :(得分:2)

尝试删除AWSProducts类中的以下行

@@product_rewards = []

并在AWSProducts类中更改product_rewards方法,如下所示:

def product_rewards
  @@product_rewards ||= []
end