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

130

При запуске любой rakeзадачи получаю:

NoMethodError: неопределенный метод `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: неопределенный метод `last_comment 'для # <Rake :: Application: 0x007ff0cf37be38>

Версии

  • Рельсы 3.2.11
  • Рейк 11.0.1
Kris
источник

Ответы:

159

Рейк 11.0.1 удаляет на last_commentметод , которыйРельсы 2.3rspec-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.

Kris
источник
Я должен использовать bundle execпосле этого, как все еще использовать rakeбез пакета 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 и использовать grep для "last_comment" в Rakefileи *.task.
Крис
7
Спасибо за это, мы все еще спасаем наш бекон в 2017 году.
Ник
2
@luke rspec 3.5 или выше.
Крис
74

в 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
equivalent8
источник
Спасибо. Больше не требуется с Rake 11.1.0
sethcall
10
хорошо, вот и мои 5 минут славы: D
эквивалент8
3
Похоже, что удаление last_comment было отменено и теперь будет удалено в rake 12.0.
Крис
3
После обновления до rake 12.0.0 я начал видеть эту ошибку. У меня сработало временное исправление @ equal8.
Blackwood
1
Обновление до rspec-core-3.5.4 решило эту проблему для меня, и я смог удалить патч обезьяны в этом ответе.
neontapir
27

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

bundle update rspec-rails

Гал Браха
источник
7
Нахожу свой собственный ответ на StackOverflow - 3 года с тех пор, как я его написал - все еще работает как по волшебству :)
Гал Браха
3
это не «всегда» хорошее решение, это может привести к установке несовместимой версии rspec -rails, лучше всегда указывать версию для использования.
Арнольд Роа
21

Просто улучшите самоцвет rspec-rails

Сейчас: gem 'rspec-rails', '~> 3.5', '>= 3.5.2'

объятий!

EderCosta
источник
1
gem 'rspec-rails', '~> 3.6'спас мне жизнь, большое спасибо !! И я подумал, что в моем коде есть что-то вроде last_comment! LOL
user1735921
20

Это проблема с рейком , которая уже решена.

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

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

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

Yekta
источник