Rails不知道如何构建任务

时间:2015-05-13 18:19:48

标签: ruby-on-rails ruby rakefile

我试图从网站上抓取数据。我从index.html.erb运行rake

 <% Article.run_rake("fetch_games") %>

我在.rb文件中定义了它。这是article.rb

require 'rake'
require 'rubygems'
#load './lib/tasks/article_task.rake'

class Article < ActiveRecord::Base

 def self.run_rake(fetch_games)
  Rails.root + "lib/tasks/article_task.rake"
  Rake::Task["fetch_games"].invoke
 end
end

这是rakefile本身:article_task.rake

desc "Fetch Games"
task :fetch_games => :environment do 

 require 'nokogiri'
 require 'open-uri'

 url = "http://espn.go.com/nba/schedule"
 data = Nokogiri::HTML(open(url))
 games = data.css('.responsive-table-wrap')

 games.each do |game|

 #check for a listing
 if !game.at_css("caption").nil?
    #Date
    puts game.at_css("caption").text
 else
    puts "No Listing"   
 end

 #check for the team name
 if !game.at_css(".team-name").nil?
    #Team name
    puts game.at_css(".team-name").text
 else
    puts "No Games Scheduled"
 end
    #empty
    puts ""
 end
end

当我从终端运行它时,它会拉动我需要的东西。但是当我尝试通过rails服务器运行它时,它给了我这个错误:

Runtime Error

我做错了什么?新的ruby / rails btw

4 个答案:

答案 0 :(得分:2)

在运行之前我们需要load_tasks。你注释掉那一行 -

 load './lib/tasks/article_task.rake'

这样做 -

  require 'rake'
  require 'rubygems'
  load './lib/tasks/article_task.rake'

  class Article < ActiveRecord::Base

    def self.run_rake(fetch_games)
      Rake::Task["fetch_games"].invoke
    end
  end

答案 1 :(得分:1)

不是通过加载调用Rake任务所需的扭曲,而是将代码移动到一个单独的单元中并将其加载到模型中(如果需要,还可以加载Rake任务)。

module GameFetcher
  def fetch
    ...
  end
end

class Article < ActiveRecord::Base
  extend GameFetcher
  ...
end

Article.fetch

这也使得为fetch逻辑编写单元测试变得更容易。

答案 2 :(得分:1)

我从rake文件中走了另一个方向。我在文章控制器中定义它并在index.html.erb中调用它。它现在显示在rails服务器中。

articles_controller.rb

require 'nokogiri'
require 'open-uri'

def index
    url = "http://espn.go.com/nba/schedule"
    data = Nokogiri::HTML(open(url))
    @games = data.css('.responsive-table-wrap')
end

index.html.erb

<% @games.each do |game| %>
        <% if !game.at_css("caption").nil? %>
          <%= game.at_css("caption").text %>
        <% else %>
          <%= 'No Games Sheduled' %>
          <% end %>
        <% end %>

答案 3 :(得分:0)

我认为这个主题可以提供帮助:Run rake task in controller

显然,在打电话给你的任务之前,你必须打电话给你:

input