NoMethodError: undefined метод `last_comment 'после обновления до рейка 11

При выполнении любой задачи rake я получаю:

NoMethodError: undefined метод `last_comment 'для

Это было после 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 метод `last_comment 'для # < Rake:: Применение: 0x007ff0cf37be38 >

Версии

  • Rails 3.2.11
  • Рейк 11.0.1

Ответ 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 будут работать снова.

UPDATE: теперь это исправлено в rspec, поэтому необходимо только обновить rspec.

Ответ 2

в Rails quick fix может быть отредактировано ./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

Ответ 3

Это проблема в грабли, которая уже исправлена.

Ответ на @equal8 является патчем обезьяны, и его следует избегать.

Как указывает @Kris, это проблема, выделенная для rake 11.0.1. Поскольку @Kris опубликовал свой ответ, доступны новые версии Rake и, в идеале, вы сможете оставаться со временем и не привязываться к старой версии рейка. Поверьте мне, я был там, и это не очень хорошая идея, если вы можете это сделать. Также это не проблема с Rails 2.3 или любой версией рельсов.

Любой 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, чтобы исправить ее:)

Ответ 4

Просто обновите драгоценный камень rspec-rails

Теперь: gem 'rspec-rails', '~> 3.5', '>= 3.5.2'

объятия!

Ответ 5

Обновление до последней версии Rspec делает работу:

bundle update rspec-rails