将控制器作为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