'Run controller as Ruby script?

In my application I setup a news controller to handle news feeds using Nokogiri:

class NewsController < InheritedResources::Base
  def new
    require 'nokogiri'
    require 'open-uri'

    doc = Nokogiri::XML(open("http://www.themusicvoid.com/feed"))
  
    @info = doc.xpath('//item').take(5).map do |i|  
      News.create(:title => i.xpath('title').inner_text, 
                  :description => i.xpath('description').inner_text, 
                  :link => i.xpath('link').inner_text, 
                  :image => i.xpath('image').inner_text)
    end
  end
end

This functions by running <%= debug @info %> in the new.html.erb file. It searches the RSS feed and automatically saves to my database.

The problem is that it would do this whenever ANYBODY loaded new.html.erb (although I could add that file to my robots.txt so at least bots wouldn't trigger it.)

What I actually want is some sort of a Ruby script or Rake task that would do the exact same thing without loading a page. If I just run the code above as a script, it works, it would output the data if I wanted to echo it, but it does not save the information to the database. Any ideas on how I might do that?



Solution 1:[1]

You can create a rake task under lib/tasks directory:

rss_fetcher.rake

require 'nokogiri'
require 'open-uri'

namespace :rss do
  desc "Fetch rss feed"
  task :fetch => :environment do
    doc = Nokogiri::XML(open("http://www.themusicvoid.com/feed"))      
    @info = doc.xpath('//item').take(5).map do |i|  
        News.create(:title => i.xpath('title').inner_text, :description =>     i.xpath('description').inner_text, :link => i.xpath('link').inner_text, :image => i.xpath('image').inner_text)
  end
  end
end

then somewhere call rake 'rss:fetch'

I highly recommend the whenever gem to do that kind of job

gem install whenever

config/schedule.rb

every 2.hours do
  rake "rss:fetch"
end

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Said Kaldybaev