将控制器作为Ruby脚本运行?

问题描述:

在我的应用程序设置一个新闻控制器来处理新闻快报利用引入nokogiri:将控制器作为Ruby脚本运行?

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 

此功能由new.html.erb文件运行<%= debug @info %>。它搜索RSS源并自动保存到我的数据库。

的问题是,它会做到这一点无论何时有人装new.html.erb(虽然我可以将该文件添加到我的robots.txt所以至少机器人不会触发它。)

我其实想要的是某种Ruby脚本或Rake任务,它可以在不加载页面的情况下完成相同的任务。如果我只是将上面的代码作为脚本运行,它会起作用,如果我想要回显它,它会输出数据,但它不会将信息保存到数据库。关于我如何做到这一点的任何想法?

您可以在LIB创建一个rake任务/任务目录:

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 

然后调用某处rake 'rss:fetch'

我强烈建议whenever宝石做那种工作

gem install whenever 

配置/ schedule.rb

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