object.find не работает в rakefile, даже если я включаю окружение - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть rakefile с заданием cron, которое обращается к одной из моих моделей, а затем выполняет поиск в моей базе данных. Я включаю свое окружение и вижу возможность создания моего объекта, но когда я пытаюсь запустить метод "find", я получаю эту ошибку:

rake aborted!
undefined method `find' for #<Feeder:0x103611df0>
/Library/Ruby/Gems/1.8/gems/activemodel-3.0.4/lib/active_model/attribute_methods.rb:364:in `method_missing'
/Library/Ruby/Gems/1.8/gems/activerecord-3.0.4/lib/active_record/attribute_methods.rb:46:in `method_missing'
/Users/josh.kerr/Documents/Projects/joshkerr.jekyll/Rakefile:28
/Users/josh.kerr/Documents/Projects/joshkerr.jekyll/Rakefile:20:in `each'
/Users/josh.kerr/Documents/Projects/joshkerr.jekyll/Rakefile:20
/Users/josh.kerr/Documents/Projects/joshkerr.jekyll/Rakefile:18:in `each'
/Users/josh.kerr/Documents/Projects/joshkerr.jekyll/Rakefile:18
/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

Вот код:

require 'rails/all'
require 'rake/clean'
require File.expand_path('../config/application', __FILE__)
require 'rubygems'
require 'sqlite3'

desc "This task is called by the Heroku cron add-on"
task :cron => :environment do
  puts "Running cron at #{Time.now.strftime('%Y/%m/%d %H:%M:%S')}..."
  require 'app/models/feeder'
  num_feeds = 10
  feedurls = ["http://twitter.com/statuses/user_timeline/2205491.rss","http://github.com/joshkerr.atom","http://gdata.youtube.com/feeds/base/users/joshkerr/uploads","http://api.flickr.com/services/feeds/photos_public.gne?id=95219360@N00&lang=en-us&format=rss_200","http://www.google.com/reader/public/atom/user%2F00755727578217480286%2Fstate%2Fcom.google%2Fbroadcast"]

  feedurls.each do |feed|
    rawfeed = Feedzirra::Feed.fetch_and_parse(feed)
    for i in 0..num_feeds do    
        # Database call
        fed = Feeder.new
        fed.title = rawfeed.entries[i].title
        fed.published = rawfeed.entries[i].published
        fed.url = rawfeed.entries[i].url
        fed.feed_id = rawfeed.entries[i].entry_id        

        fed.find(1) # <- FAILS HERE!!!
        #if not fed.Find(1) then

          if fed.url.include? "twitter.com" then        
                  fed.feed_service="twitter"
          elsif fed.url.include? "github.com" then
                  fed.feed_service="github"
          elsif fed.url.include? "flickr.com" then
                  fed.feed_service="flickr"
          elsif fed.url.include? "youtube.com" then
                  fed.feed_service="youtube"
          elsif fed.feed_id.include? "google.com" then
                  fed.feed_service="reader" 
          else
              fed.feed_service = "reader"
          end

          fed.save    
        #end
    end
  end

  puts "Done creating feed"

  puts "done."

end

1 Ответ

1 голос
/ 24 февраля 2011

find является методом класса ActiveRecord и не определен для экземпляра объекта ActiveRecord.Итак, чтобы найти Feeder с идентификатором 1, вы должны позвонить Feeder.find(1).

Еще одна вещь, которую я заметил, это: строка task :cron => :environment означает, что среда уже загружается -это включает rails/all, rubygems (вы используете Rails 3, который использует Bundler), sqlite3 (при условии, что это в вашем Gemfile, и вы запустили bundle install для генерации Gemfile.lock, и всеваши модели. Попробуйте удалить все строки requires и посмотрите, по-прежнему ли выполняется ваша задача rake.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...