在升级到rake 11后出现了NoMethodError: undefined method `last_comment'错误

137

运行任何rake任务时,我收到以下错误:

NoMethodError: undefined method `last_comment' for

这是在运行bundle update之后发生的,该命令拉取了新版本的rake,版本为11.0.1

$ grep rake Gemfile.lock
       rake
       rake (>= 0.8.7)
     rake (11.0.1)
       rake
$ bundle update
$ bundle exec rake db:drop # any rake task

NoMethodError: undefined method `last_comment' for #< Rake::Application:0x007ff0cf37be38>

版本信息

  • Rails 3.2.11
  • Rake 11.0.1
5个回答

171

Rake 11.0.1 移除了 last_comment 方法,这会影响到 Rails 2.3 rspec-core (< 3.4.4) 的使用。因此,在修补程序发布之前/之后,我们需要在 Gemfile 中将 rake 版本固定为旧版本:

gem 'rake', '< 11.0'

那么:

$ bundle update
$ grep rake Gemfile.lock 
      rake
      rake (>= 0.8.7)
    rake (10.5.0)
      rake
  rake (< 11.0)

我们现在正在使用版本为10.5.0的rake,它仍然具有last_comment方法,因此我们的rake任务将再次正常工作。

更新:rspec现在已经修复了这个问题,所以唯一需要做的就是更新rspec。


我必须在执行此操作后使用 bundle exec,如何仍然可以使用 rake 而不需要 bundle exec? - svelandiag
你能澄清一下你所说的“Rails 2.3”使用情况吗?我正在使用Rails 4,执行rake db:create:all时会抛出异常。 - yekta
@yekta Rails 2.3期望Rake有一个名为last_comment的方法,但我不记得在代码库中它在哪里。我不知道Rails 4是否也调用last_comment。但是你可以检查rails代码库,切换到Rails 4分支,并在Rakefile*.task中搜索“last_comment”。 - Kris
8
谢谢你,这依然在2017年拯救了我们的局面。 - Nick Schwaderer
2
@luke RSpec 3.5或更高版本。 - Kris
显示剩余3条评论

78

在Rails中,快速修复可以通过编辑./Rakefile(位于您的应用程序文件夹中)来实现。

在调用Rails.application.load_tasks之前添加以下行:

module TempFixForRakeLastComment
  def last_comment
    last_description
  end 
end
Rake::Application.send :include, TempFixForRakeLastComment

整个Rakefile的样子可能是这样的

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

+ # temp fix for NoMethodError: undefined method `last_comment'
+ # remove when fixed in Rake 11.x
+ module TempFixForRakeLastComment
+   def last_comment
+     last_description
+   end 
+ end
+ Rake::Application.send :include, TempFixForRakeLastComment
+ ### end of temfix
+ 
  task "resque:preload" => :environment

  Rails.application.load_tasks

感谢您。自Rake 11.1.0起,不再需要此功能。 - sethcall
12
好的,我的五分钟成名到此为止了 :D - equivalent8
3
看起来last_comment的移除被撤销了,并将在Rake 12.0中删除。原文链接:https://github.com/ruby/rake/commit/3948349a82a2522f1d8293093164ef395bee542d - Kris
3
升级到rake 12.0.0后,我开始看到了这个错误。 @equivalent8的临时解决方法对我有用。 - blackwood
1
升级到rspec-core-3.5.4解决了我的问题,我能够在这个答案中删除猴子补丁。 - neontapir
显示剩余4条评论

29

更新到最新的 Rspec gem 就可以完成工作:

bundle update rspec-rails


9
在StackOverflow上找到自己的答案-已经过去了3年-仍然像魔法一样有效 :) - Gal Bracha
3
这不是“总是”一个好的解决方案,这可能会安装一个不兼容的RSpec-Rails版本,最好始终指定要使用的版本。 - Arnold Roa

22

只需升级宝石rspec-rails

现在: gem 'rspec-rails','〜>3.5','≥3.5.2'

拥抱!


2
gem 'rspec-rails','~> 3.6' 拯救了我的生命,非常感谢!我还以为我的代码里有类似 last_comment 的东西呢!哈哈 - user1735921

20

这是一个已经解决的rake问题(链接)

@equivalent8的答案是一个猴子补丁,应该避免使用。

正如@Kris所指出的,这是一个仅限于rake 11.0.1的问题。自从@Kris发布他的答案以来,已经有新版本的Rake可用,理想情况下,您将能够跟上时代,而不会被固定在旧版rake上。相信我,我也曾经历过这种情况,如果您可以避免,这并不是一个好主意。此外,这不是Rails 2.3或任何版本的rails的问题。

任何Rake < v11.0.1 或者 > v11.0.1 and < v12都可以工作,但这仍然是一种绕过方式,同样应该避免使用;理想情况下,您将能够跟上时代。

由于last_comment即将被弃用,因此依赖项本身应该升级。在我的情况下,它是rspec-core,巧合的是在中修复了此问题(链接)

修复方法

升级您的依赖项到一个不调用last_comment而是调用last_description的版本。这可能是rspec,将rspec-core升级到3.4.4或更高版本即可解决问题。 rspec-core< 3.4.4会调用last_comment

如果您的依赖项没有一个不调用last_description的版本,请成为一个好公民并提交一个PR来修复它:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接