完善后的代码
require 'open-url' require 'nokogiri' class Facebook def self.query_likes puts 'this is run time => ' + Time.now.to_s begin url = "http://api.facebook.com/method/fql.query?query='select like_count from XXX where url = XXX/XX/$S'" Dialog.order("id desc").each do |d| path = url.gsub("$S",d.id.to_s) open(path) do |f| tparse = Nokogiri::XML(f) d.likes = tparse.css("like_count").text.to_i d.save end rescue => err puts err end end end
测试代码
require 'spec_helper' describe Facebook do before do 添加数据 end #使用mock进行假数据封装 it "Facebook to get likes" do url = "https://api.facebook........."#定义open的url Facebook.should_receive(:open).with(url.gsub("$S",@dialog.id.to_s)).orderd.and_yield("<xml><like_count>10</like_count></xml>")#封装open的返回对象 Facebook.query_likes #调用测试方法 @dialog,reload.likes.should == 10 #判断测试值 end end
写完后,可以在命令行里执行测试命令了 rspec spec/models/facebook_spec.rb
如果没有报错的话,这个功能就测试成功了。
下面添加定时
定时采用的是 whenever 插件
安装方法请参考http://www.xiaoyangsheng.com/2011/04/ruby-on-rails%E9%87%8C%E7%94%A8whenever-gem%E7%AE%A1%E7%90%86cron%E4%BB%BB%E5%8A%A1/
或者
http://blog.zool.it/posts/Tasks-plug-in-whenever-the-timing-rails
这两个人写的还是比较好的,英文的看不懂 所以,,,啊哈 今天天气真不错。。。
安装成功后 在config目录下 会有一个schedule.rb的文件打开后编辑
every 15.minute do runner "Facebook.query_likes" end
将这段代码插入其中
在命令行里执行
whenever --set environment=development --update-crontab
执行后可以使用
crontab -l 查看正在运行的定时器
crontab -r 关闭运行的定时器(这里有个问题,我的定时器关闭后,还一直在执行。正在纠结中,找到原因后在来说明吧)