【问题标题】:Rake task NoMethodError: undefined method `task' for main:Object耙任务NoMethodError:未定义的方法“任务”主要:对象
【发布时间】:2016-09-13 21:33:39
【问题描述】:

我在控制台中有这段代码可以正常工作(!!!没有第一行“任务...”!!!)。它在数据库中创建事件。但是运行 rake (rake fetch_ttt) 时运气不佳:

task :fetch_ttt => :environment do
    require 'nokogiri'
    require 'open-uri'

    url = "http://www.example.com"
    doc = Nokogiri::HTML(open(url))
    doc.css("#eventrow").each do |item|
        unless Event.find_by_name(item.at_css("a").text).present?
            Event.create(
                :start_time => item.at_css("#eventdate").text,
                :name => item.at_css("a").text,
                :url => item.at_css("a")[:href]
            )
        end
    end
end

这是痕迹(在试运行中也不多):

** Invoke fetch_ttt (first_time)
** Invoke environment (first_time)
** Execute (dry run) environment
** Execute (dry run) fetch_ttt

几个小时前还好。从那时起,我进行了“捆绑更新”,进行了一些数据库迁移,编辑了关联。我尝试回滚迁移并删除了模型关联更改,但没有成功。我怀疑是宝石。

下面的 3 个 gem 我回滚到以前的版本,看看他们是否负责,但不是。以及完整的差异。

旧的:

gem 'rake',           '10.5.0'
gem 'http',            '0.9.8'
gem 'ipaddress',        '0.8.2'

完全差异:

-    bcrypt (3.1.10)
+    bcrypt (3.1.11)
-    carrierwave (0.10.0)
+    carrierwave (0.11.2)
+      mimemagic (>= 0.3.0)
-    concurrent-ruby (1.0.0)
+    concurrent-ruby (1.0.2)
-    devise (3.5.6)
+    devise (4.1.1)
-      railties (>= 3.2.6, < 5)
+      railties (>= 4.1.0, < 5.1)
-      thread_safe (~> 0.1)
-    domain_name (0.5.20160128)
+    domain_name (0.5.20160310)
-    excon (0.45.4)
+    excon (0.49.0)
-      excon (~> 0.45)
+      excon (~> 0.49)
****lots of stuff related to "fog" gem
-    http (0.9.8)
+    http (0.9.9)
-    ipaddress (0.8.2)
+    ipaddress (0.8.3)
-    mime-types (2.99)
-    mini_magick (4.4.0)
+    mime-types (2.99.1)
+    mimemagic (0.3.1)
+    mini_magick (4.5.1)
     mini_portile2 (2.0.0)
-    minitest (5.8.4)
-    multi_json (1.11.2)
+    minitest (5.9.0)
+    multi_json (1.12.0)
-    rails_stdout_logging (0.0.4)
+    rails_stdout_logging (0.0.5)
-    responders (2.1.1)
+    responders (2.2.0)
-    sprockets (3.5.2)
+    sprockets (3.6.0)
-    sprockets-rails (3.0.1)
+    sprockets-rails (3.0.4)
-    tilt (2.0.2)
+    tilt (2.0.4)

Rails 4.2.5,Ruby 2.1.4,我在 C9 IDE 上。但也不适用于heroku。

更新

现在在我只得到的控制台中恢复到 rake 10.5.0(并且做了 grep rake Gemfile.lock):

<Rake::Task fetch_ttt => [environment]>

抓取根本不运行:(

【问题讨论】:

  • 您可能希望将Event.create( 更改为Event.create!(。当无法保存事件时,这会引发异常。该错误消息可能会帮助您确定问题的根本原因。
  • 谢谢,但看起来它是第一行。请在下面查看我对 Jeffrey 评论的回复

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems rake


【解决方案1】:

我认为这里没有足够的信息来给出明确的答案,但我会首先调查它在 heroku 上不起作用的根本原因。

例如,rake 任务是否运行?你怎么知道的?

如果是这样,请执行heroku run rails c 并尝试自己执行代码序列。在您期望有机会之前和之后检查数据库记录。发生了什么?

如果它没有运行,你得到了什么类型的输出? heroku logs 也很有帮助。

另一个小技巧,可以将byebugheroku logs -t 一起使用。虽然我只在你的暂存环境中推荐这个,并且只有在你愿意之后清理 git 历史记录的情况下才建议这样做。

简而言之,我的答案是我会通过更直接的调试来解决。希望这可以帮助。

【讨论】:

  • 感谢您的回复。我在 heroku 应用程序日志中看到了这一点: 2016-05-17T18:48:20.173330+00:00 heroku[run.1863]: 使用命令启动进程 bundle exec rake fetch_ttt 2016-05-17T18:48:20.471600+00:00 heroku [run.1863]:状态从开始变为向上 2016-05-17T18:48:25.987409+00:00 heroku[run.1863]:状态从向上变为完整 2016-05-17T18:48:25.953054+00: 00 heroku[run.1863]:进程以状态 0 退出,没有任何东西保存到数据库中
  • 对,所以我会 heroku run rails c 在您的 heroku rails 环境中获得交互式提示,然后我会尝试逐行手动运行有问题的代码,以找出它失败的地方。跨度>
  • hmmmm.... 我得到:“NoMethodError: undefined method `task' for main:Object from (irb):2”。立即谷歌搜索
  • 哪一行代码产生了这个错误?我没有看到您的代码中引用了 task 变量。
  • 就是这一行:“task :fetch_ttt => :environment do”。
【解决方案2】:

评论完毕

#require 'nokogiri'
#require 'open-uri'

现在它可以工作了。即使使用 rake 11.1.2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多