2017-02-05 47 views
0

У меня есть этот код, чтобы скрести сайт рейтинга http://example.com/ из Alexa
В lib/recurring.rb я естьRails: как отображать данные, полученные из фоновой задачи на главном экране?

module Recurring 
    class MyTask 
    include Delayed::RecurringJob 
    run_every 1.day 
    run_at '12:00pm' 
    timezone 'UTC' 
    def perform 
     url = "http://alexa.com/siteinfo/example.com" 
     doc = Nokogiri::HTML(open(url)) 
     @rank = doc.at_css("strong.metrics-data.align-vmiddle").text 
    end 
    end 
end 

У меня есть raketask, чтобы выполнить это в lib/tasks/my_task.rake

namespace :recurring do 
    desc "Get website rank everyday at 12:00 OM UTC" 
    task init: :environment do 
    #Delete any previously-scheduled recurring jobs 
    Delayed::Job.where('(handler LIKE ?)', '--- !ruby/object:Recurring::%').destroy_all 

    Recurring::MyTask.schedule! 
    end 
end 

когда я бегу

$ rake recurring:init 

Задача выполнена каждый день t 12:00 utc, и у меня есть рейтинг сайта в @rank (номер строки 10 recurring.rb).

Но как я могу отображать эти данные на своей индексной странице? Я новичок в обработке фона. Любая помощь очень ценится.

+0

Ваш вопрос не ясен. Как только вы сохраните эту информацию о ранге в db, она будет автоматически отражаться в ваших представлениях. Таким образом, проблема заключается в том, что вы не сохраняете данные в db или не знаете, как отображать их в представлении, и что это такое? –

+0

@Joel_Blum Я не сохраняю '@ rank' в db. есть ли способ, которым я могу заставить его diplayed без участия db –

+0

, вероятно, нет разумного выбора, но, экономя его до db, почему бы вам не захотеть задействовать db? –

ответ

1

Переменные экземпляра находятся в памяти и не используются между вашей рейк-задачей и сервером. Поэтому для передачи данных от одного к другому вам требуется постоянство. База данных является стандартным выбором, но вы можете гипотетически использовать файловую систему, Redis и т. Д.

Поскольку вы добавили :environment к своей задаче, у вас есть доступ к вашим моделям (без нее задача похожа на автономный скрипт Ruby).

Например:

rails g model SiteRanking rank:string 
rake db:migrate 

# in rake task 
SiteRanking.create(rank: @rank) 

# in controller 
@rank = SiteRanking.last.try(:rank) # will be nil if no record exists