2011-02-04 100 views
0

我再次在Rails中苦苦挣扎日期格式。我试图比较一个从ActiveRecord的日期到在cron rake中创建推文的日期,但是我收到了我不明白的错误。长期解析Twitter日期为整数

"Wed Feb 02 23:04:18 +0000 2011" 
1296687858 

2009-08-31 07:00:00 UTC 
1251698400 
survived 

"Wed Feb 02 22:31:33 +0000 2011" 
1296685893 

2009-08-31 07:00:00 UTC 
1251698400 
survived 

"Wed Feb 02 22:24:00 +0000 2011" 
1296685440 

2009-08-31 07:00:00 UTC 
1251698400 
survived 

"Wed Feb 02 20:40:57 +0000 2011" 
1296679257 

2009-08-31 07:00:00 UTC 
1251698400 
survived 

"Fri Jan 28 22:17:23 +0000 2011" 
1296253043 

2009-08-31 07:00:00 UTC 
1251698400 
survived 

rake aborted! 
can't convert String into Integer 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:29:in `[]' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:29:in `fetch_tweets' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:27:in `each' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:27:in `fetch_tweets' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:12:in `each' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:12:in `fetch_tweets' 
/Users/phil/Sites/travlrapp.com/lib/tasks/cron.rake:160 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run' 
/Library/Ruby/Gems/1.8/gems/rake-0.8.7/bin/rake:31 
/usr/bin/rake:19:in `load' 
/usr/bin/rake:19 

这行29放鸣叫[“created_at”]。检查,但如果我删除,这将在不久后谈到的if语句致命错误。

desc "Automated Tasks" 
task :cron => :environment do 

    # TASK FUNCTIONS 
    def fetch_tweets 
     users = User.find(
      :all, 
      :include => [ :authentications, :current_trip ], 
      :conditions => 'trips.id > 0' 
     ) 

     users.each do |user| 

      auth = user.authentications.find(:first, :conditions => { :provider => 'twitter' }) 

      # Only bother if they are connected to twitter 
      if user.current_trip and auth and auth['token'] and auth['secret'] then 

       # Exchange our oauth_token and oauth_token secret for the AccessToken instance. 
       access_token = Twitter.connect(auth['token'], auth['secret']) 

       # use the access token as an agent to get the home timeline 
       response = access_token.request(:get, "http://api.twitter.com/1/statuses/user_timeline.json") 

       tweets = ActiveSupport::JSON.decode(response.body) 

       tweets.each do |tweet| 

        puts tweet['created_at'].inspect 
        puts Chronic::parse(tweet['created_at']).to_i 
        puts '' 

        puts user.current_trip.start_date 
        puts Chronic::parse(user.current_trip.start_date).to_i 

        # has coordinates and was tweeted since the start date 
        if tweet['coordinates'] != nil and (Chronic::parse(tweet['created_at']).to_i) >= (Chronic::parse(user.current_trip.start_date).to_i) 

         coords = tweet['coordinates']['coordinates']; 

         entry = Entry.new 
         entry.text = tweet['text'] 
         entry.resource = "http://twitter.com/#{tweet['user']['screen_name']}/status/#{tweet['id']}" 
         entry.source = 'twitter' 
         entry.user_id = user.id 
         entry.trip_id = user.current_trip.id 
         entry.latitude = coords[1] 
         entry.longitude = coords[0] 
         entry.published_at = tweet['created_at'] 
         entry.unique = 'twitter-' + (tweet['id']).to_s 

         puts entry.inspect if entry.save 

        end 

        puts 'survived' 
        puts '' 

       end 
      end 

     end # users.each 
    end 

现在我觉得奇怪的是,它似乎完全转换两个日期,然后显示unix时间进行比较。那么,为什么在某个时候它是致命的错误?

回答

0

修正这个搭配:

next unless tweet and tweet.class == Hash 
0

此时Tweet鸣叫格式错误。你正在期待一个数组,但它不是 - 来自json的整个推文记录被表示为一个字符串。

只需在tweets.each do |tweet|(与匹配的end)之间放置一个if tweet.respond_to?(:each)即可。

+0

所有鸣叫的“哈希”,并有两个项目分别是“阵列”。 http://d.pr/xrhc我试过“下一个如果tweet.class =='阵列'”,但没有奏效。 – 2011-02-06 20:33:44