2016-03-09 30 views
103

Po uruchomieniu dowolnego rake zadanie uzyskać:NoMethodError: niezdefiniowana metoda `last_comment” po uaktualnieniu do natarcia 11

NoMethodError: undefined method `last_comment' for

To było po bundle update który ciągnięty w nowej wersji, wersja 11.0.1 prowizji.

$ 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

  • szyn 3.2.11
  • Zgrabiarka 11.0.1

Odpowiedz

111

Zgrabiarka 11.0.1 removes sposób last_comment które szyn 2,3 rspec -core (< 3.4.4) używa. Dlatego aż/jeśli plaster jest zwolniony musimy przypiąć grabie 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) 

Jesteśmy teraz przy użyciu grabi 10.5.0 który nadal ma metodę last_comment a nasze zadania rake znów będą działać.

UPDATE: Obecnie została ustalona w RSpec, więc jedyną rzeczą, konieczne powinny być aktualizowania rspec.

+0

Muszę użyć 'bundle exec' po tym, jak po prostu nadal używać' rake' bez pakietu exec? – SsouLlesS

+0

@SouLlesS musisz odinstalować rake 11.0 – Kris

+0

Czy możesz wyjaśnić, że twój "Rails 2.3" używa komentarza? Jestem na Rails 4 i 'rake db: create: all' zgłasza ten wyjątek. – yekta

60

w szynach szybkie poprawki może być edycja ./Rakefile (w folderze aplikacji)

i dodać te linie przed wywołaniem Rails.application.load_tasks:

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

więc cała Rakefile moż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 
+0

Dzięki. Nie jest to już konieczne od Rake 11.1.0 – sethcall

+9

fajnie, idzie moje 5 minut sławy: D – equivalent8

+0

Nadal otrzymuję to z Rake 11.1.1. – jasnow

20

To jest issue in rake, który już został rozwiązany.

Odpowiedź @ equivalent8 jest łatką małpy i należy jej unikać.

Jak zaznacza @Kris, jest to problem izolowany pod numerem rake 11.0.1. Odkąd @Kris opublikował swoją odpowiedź, dostępne są nowe wersje Rake'a i idealnie będziesz mógł pozostać z duchem czasu i nie być przypięty do starej wersji rake. Uwierz mi, byłem tam i nie jest to dobry pomysł, jeśli możesz pomóc. Nie stanowi to również problemu z Railsami 2.3 i żadnymi wersjami szyn.

Każda prowizja < v11.0.1 lub > v11.0.1 and < v12 będzie działać, ale nadal jest to obejście i należy jej również unikać; idealnie będziecie mogli pozostać z duchem czasu.

Ponieważ last_comment jest przestarzałe, sama zależność powinna zostać zaktualizowana. W moim przypadku był to rspec-core, który przypadkowo naprawił to tylko w v3.4.4.

The Fix

Zmień swoją zależność do wersji, która nie wymaga last_comment ale wzywa last_description zamiast. To prawdopodobnie rspec i aktualizacja rspec-core do wersji 3.4.4 lub nowszej naprawi to. rspec-core < 3.4.4 połączenia last_comment.

Jeśli zależność nie posiada wersję, która nie wymaga last_description, być dobrym obywatelem i złożyć PR to naprawić :)

17

Aktualizacja do najnowszej Rspec gem działa:

bundle update rspec-rails

+3

Znajdź własną odpowiedź na StackOverflow - ** 3 lata ** Od czasu, gdy ją napisałem - Wciąż działa jak magia :) –

+1

to nie jest "zawsze" dobre rozwiązanie, może zainstalować niekompatybilną wersję rspec -rails, lepiej zawsze określać wersję do wykorzystania. –

15

Wystarczy zaktualizować gem rspec-rails

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

przytula!

+0

'gem 'rspec-rails', '~> 3.6'' uratowało moje życie, wielkie dzięki! I pomyślałem, że mam coś takiego jak last_comment w moim kodzie! lol – user1735921