NoMethodError: undefined method `last_comment 'po aktualizacji do rake 11

130

Podczas uruchamiania dowolnego rakezadania otrzymuję:

NoMethodError: undefined method `last_comment 'for

To było po bundle updateczym ściągnąłem nową wersję rake, wersję 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>

Wersje

  • Szyny 3.2.11
  • Rake 11.0.1
Kris
źródło

Odpowiedzi:

160

Rake 11.0.1 usuwalast_comment metodą, któraSzyny 2.3rspec-core (<3.4.4) używa. Dlatego do / jeśli łatka zostanie wydana, musimy przypiąć rake do starszej wersji w Gemfile:

gem 'rake', '< 11.0'

następnie:

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

Używamy teraz rake'a 10.5.0, który wciąż ma tę last_commentmetodę, a nasze rakezadania znów będą działać.

UPDATE : Zostało to naprawione w rspec, więc jedyną potrzebną rzeczą powinna być aktualizacja rspec.

Kris
źródło
Muszę użyć bundle execpo zrobieniu tego, jak po prostu nadal używać rakebez pakietu exec ??
svelandiag
Czy możesz wyjaśnić, że Twoje "Rails 2.3" używa komentarza? Jestem na Rails 4 i rake db:create:allzgłasza ten wyjątek.
yekta
@yekta Rails 2.3 oczekuje, że Rake będzie miał metodę o nazwie last_comment, której w bazie kodu nie pamiętam. Nie wiem, czy Rails 4 również wywołuje last_comment. Ale możesz sprawdzić bazę kodów Rails, przełączyć się do gałęzi Rails 4 i grep dla "last_comment" w Rakefilei *.task.
Kris
7
Dziękuję za to, wciąż ratując nasz boczek w 2017 roku.
Nick Schwaderer
2
@luke rspec 3.5 lub nowszy.
Kris
74

w Railsach można edytować szybką poprawkę ./Rakefile(w folderze aplikacji)

i dodaj te linie, zanim zadzwonisz Rails.application.load_tasks:

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

więc całość Rakefilemoże wyglądać

  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
odpowiednik 8
źródło
Dzięki. Nie jest już potrzebne od Rake 11.1.0
sethcall
10
fajnie, idzie moje 5 minut sławy: D
odpowiednik8
3
Wygląda na to, że usunięcie last_comment konta zostało cofnięte i zostanie zamiast tego usunięte w rake 12.0.
Kris
3
Po aktualizacji do rake 12.0.0 zacząłem widzieć ten błąd. Poprawka tymczasowa @ ekwiwalentu8 zadziałała dla mnie.
Blackwood
1
Aktualizacja do rspec-core-3.5.4 rozwiązała ten problem i udało mi się usunąć poprawkę małpy w tej odpowiedzi.
neontapir
27

Aktualizacja do najnowszego Rspecklejnotu działa:

bundle update rspec-rails

Gal Bracha
źródło
7
Znalezienie własnej odpowiedzi na StackOverflow - 3 lata odkąd to napisałem - Nadal działa jak magia :)
Gal Bracha
3
nie jest to "zawsze" dobre rozwiązanie, może to spowodować zainstalowanie niezgodnej wersji rspec -rails, lepiej zawsze określać wersję, która ma być używana.
Arnold Roa
21

Po prostu ulepsz klejnot rspec-rails

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

uściski!

EderCosta
źródło
1
gem 'rspec-rails', '~> 3.6'uratował mi życie, wielkie dzięki !! I pomyślałem, że mam w kodzie coś w rodzaju last_comment! LOL
user1735921
20

Jest to problem z prowizją , który został już rozwiązany.

Odpowiedzią @ ekwiwalent8 jest łatka małpy i należy jej unikać.

Jak wskazuje @Kris, jest to problem ograniczony rake 11.0.1. Odkąd @Kris opublikował swoją odpowiedź, dostępne są nowe wersje Rake i idealnie byłoby, gdybyś był w stanie dotrzymać kroku czasom i nie zostać przypięty do starej wersji rake. Wierz mi, byłem tam i nie jest to dobry pomysł, jeśli możesz temu zapobiec. Nie jest to również problem z Railsami 2.3 ani żadną inną wersją railsów.

Any Rake < v11.0.1lub> v11.0.1 and < v12 będą działać, ale nadal jest to obejście i należy go również unikać; idealnie będziesz w stanie nadążyć za duchem czasu.

Ponieważ last_commentjest przestarzała, sama zależność powinna zostać zaktualizowana. W moim przypadku to, rspec-corenawiasem mówiąc, naprawiło to tylko w wersji 3.4.4 .

Poprawka

Uaktualnij swoją zależność do wersji, która nie wywołuje, last_commentale wywołuje last_description. Prawdopodobnie rspeci aktualizacja rspec-coredo wersji 3.4.4 lub nowszej naprawi to. rspec-core<3.4.4 połączeń last_comment.

Jeśli twoja zależność nie ma wersji, która nie dzwoni last_description, bądź dobrym obywatelem i prześlij PR, aby to naprawić :)

yekta
źródło