NoMethodError:升级到rake 11后未定义的方法`last_comment'

运行任何rake任务时,我会得到:

NoMethodError:未定义的方法`last_comment'

这是bundle update后拉到新版本的耙,版本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:未定义的方法`last_comment'为#<Rake :: Application:0x007ff0cf37be38>

版本

  • Rails 3.2.11
  • 耙子11.0.1

Rake 11.0.1 删除了last_comment方法 Rails 2.3 rspec-core(<3.4.4)使用。 因此,直到/如果一个补丁被释放,我们需要在Gemfile中把耙子钉到一个较旧的版本:

 gem 'rake', '< 11.0' 

然后:

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

我们现在使用rake 10.5.0,它仍然有last_comment方法,我们的rake任务将再次运行。

更新 :现在已经固定在rspec中,所以唯一需要更新rspec。

在Rails quick fix中可以编辑./Rakefile (在你的app文件夹中)

并在调用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 

已经解决了这个问题 。

@ 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顺便只在v3.4.4中解决了这个问题 。

修正

将您的依赖关系升级到不调用last_comment的版本,而是调用last_description 。 它可能rspec和升级rspec-core到3.4.4或更高版本将解决它。 rspec-core <3.4.4调用last_comment

如果你的依赖没有一个不叫last_description的版本,做一个好公民并且提交一个PR来解决它:)

只需升级gem rspec-rails

现在: gem 'rspec-rails', '~> 3.5', '>= 3.5.2'

拥抱!

更新到最新的Rspecgem做的工作:

bundle update rspec-rails