【问题标题】:Rake task not saving or creating new record in database耙任务未在数据库中保存或创建新记录
【发布时间】:2016-08-22 19:33:12
【问题描述】:

我创建了一个 ruby​​ 脚本,如果我从控制台运行它,它可以正常执行。

该脚本从各个网站获取一些信息并将其保存到我的数据库表中。

但是,当我想将代码变成 rake 任务时,代码仍然运行,但它没有保存任何新记录。我也没有从 rake 中得到任何错误。

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be           available to Rake.

require File.expand_path('../config/application', __FILE__)

Rails.application.load_tasks

require './crawler2.rb'
task :default => [:crawler]

task :crawler do

### ###

require 'rubygems'
require 'nokogiri'
require 'open-uri'

start = Time.now

$a = 0

sites = ["http://www.nytimes.com","http://www.news.com"]

for $a in 0..sites.size-1

url = sites[$a] 

$i = 75

$error = 0

avoid_these_links = ["/tv", "//www.facebook.com/"]

doc = Nokogiri::HTML(open(url))

    links = doc.css("a")
    hrefs = links.map {|link| link.attribute('href').to_s}.uniq.sort.delete_if {|href| href.empty?}.delete_if {|href| avoid_these_links.any? { |w| href =~ /#{w}/ }}.delete_if {|href| href.size < 10 }

#puts hrefs.length

#puts hrefs

for $i in 0..hrefs.length
    begin

        #puts hrefs[60] #for debugging)

    #file = open(url)
    #doc = Nokogiri::HTML(file) do

        if hrefs[$i].downcase().include? "http://"

            doc = Nokogiri::HTML(open(hrefs[$i]))

        else 

            doc = Nokogiri::HTML(open(url+hrefs[$i]))

        end 

        image = doc.at('meta[property="og:image"]')['content']
        title = doc.at('meta[property="og:title"]')['content']
        article_url = doc.at('meta[property="og:url"]')['content']
        description = doc.at('meta[property="og:description"]')['content']
        category = doc.at('meta[name="keywords"]')['content']

        newspaper_id = 1 


        puts "\n"
        puts $i
        #puts "Image: " + image
        #puts "Title: " + title
        #puts "Url: " + article_url
        #puts "Description: " + description
        puts "Catory: " + category

            Article.create({ 
            :headline => title, 
            :caption => description, 
            :thumbnail_url => image, 
            :category_id => 3, 
            :status => true, 
            :journalist_id => 2, 
            :newspaper_id => newspaper_id, 
            :from_crawler => true,
            :description => description,
            :original_url => article_url}) unless Article.exists?(original_url: article_url)

        $i +=1

        #puts $i #for debugging

        rescue
        #puts "Error here: " + url+hrefs[$i] if $i < hrefs.length
        $i +=1    # do_something_* again, with the next i
        $error +=1

    end 

end

puts "Page: " + url
puts "Articles: " + hrefs.length.to_s
puts "Errors: " + $error.to_s

$a +=1

end

finish = Time.now

diff = ((finish - start)/60).to_s

puts diff + " Minutes"


### ###


end

如果我将文件保存为 crawler.rb 并通过执行 --> "load './crawler2.rb'" 在控制台中打开它,代码执行得很好。当我在 rake 任务中使用完全相同的代码时,我没有得到任何新记录。

【问题讨论】:

  • 感觉这里少了点什么。 task :crawler do 永远不会用 end 关闭。文章创建实际上是在任务中吗?缩进暗示可能不是?
  • 感谢您的意见,但恐怕不是这样。我用一些 print/puts 语句进行了测试,这些语句也能完美运行。就像代码只是跳过了 .create 部分。不知道是我用错了Rake还是语法不对?
  • 语法错误。 “做”需要在某处“结束”。
  • 请将您的代码格式化为 ruby​​ 标准,并消除滚动。
  • 欢迎来到 Stack Overflow。你可以改进你的问题。请阅读Minimal, Complete, and Verifiable example。当您的代码不加赘述地显示您的确切问题时,您就是在尊重那些自愿帮助您的人。

标签: ruby-on-rails ruby activerecord rake rakefile


【解决方案1】:

我知道出了什么问题。

我需要删除:

require './crawler2.rb'
task :default => [:crawler]

改为编辑以下内容:

task :crawler => :environment do

现在,在 Heroku 调度程序的帮助下,爬虫每十分钟运行一次 :-)

感谢各位的帮助 - 并对格式错误表示歉意。希望这个答案可以帮助其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2019-09-29
    • 2017-06-07
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多