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'
拥抱!
更新到最新的Rspec
gem做的工作:
bundle update rspec-rails