如何 运行 控制器在 config/schedule 时的动作

How to run a controller's action in whenever's config/schedule

我以前从未使用过 whenever 应用程序。试图了解如何使用它来 运行 来自控制器的动作。这可能吗?

控制器

class EntriesController < ApplicationController


def index
  @entries = Entry.all
end

def scrape
    require 'open-uri'
    doc = Nokogiri::HTML(open("https://www.reddit.com/"))

    entries = doc.css('.entry')
    entriesArray = []
    entries.each do |entry|
      title = entry.css('p.title > a').text
      link = entry.css('p.title > a')[0]['href']
      entriesArray << Entry.new({ title: title, link: link })
    end

    if entriesArray.map(&:valid?)
      entriesArray.map(&:save!)
    end

    respond_to do |format|
      format.html { redirect_to entries_url, notice: 'Entries were successfully scraped.' }
      format.json { entriesArray.to_json }
    end
  end

end

Config/schedule.rb

every 1.day, :at => "12:00pm" do 
    runner "Task.scrape"
end

它看起来不像是接受任何参数。不要忘记控制器只是 Ruby 个对象:

EntriesController.new.scrape

将您的代码移动到单独的文件并在 schedule.rb 和控制器中重新使用它:

# lib/reddit_scrapper.rb
require 'open-uri'

module RedditScrapper
  def self.scrape
    doc = Nokogiri::HTML(open("https://www.reddit.com/"))

    entries = doc.css('.entry')
    entriesArray = []
    entries.each do |entry|
      title = entry.css('p.title > a').text
      link = entry.css('p.title > a')[0]['href']
      entriesArray << Entry.new({ title: title, link: link })
    end

    if entriesArray.map(&:valid?)
      entriesArray.map(&:save!)
    end
  end
end

控制器代码:

class EntriesController < ApplicationController
  def index
    @entries = Entry.all
  end

  def scrape
    RedditScrapper.scrape

    respond_to do |format|
      format.html { redirect_to entries_url, notice: 'Entries were successfully scraped.' }
      format.json { entriesArray.to_json }
    end
  end
end

每当任务:

every 1.day, :at => "12:00pm" do 
  runner "RedditScrapper.scrape"
end