NoMethodError: méthode non définie `last_comment 'après la mise à niveau vers rake 11

130

Lors de l'exécution d'une raketâche que j'obtiens:

NoMethodError: méthode non définie `last_comment 'pour

Ce fut après bundle updatequoi tiré dans la nouvelle version de rake, version 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: méthode non définie `last_comment 'pour # <Rake :: Application: 0x007ff0cf37be38>

Versions

  • Rails 3.2.11
  • Râteau 11.0.1
Kris
la source

Réponses:

159

Rake 11.0.1 supprime lelast_comment méthode quiRails 2.3rspec-core (<3.4.4) utilise. Par conséquent, jusqu'à / si un correctif est publié, nous devons épingler rake à une version plus ancienne de Gemfile:

gem 'rake', '< 11.0'

puis:

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

Nous utilisons maintenant rake 10.5.0 qui a toujours la last_commentméthode et nos raketâches fonctionneront à nouveau.

MISE À JOUR : Ceci a maintenant été corrigé dans rspec, donc la seule chose nécessaire devrait être de mettre à jour rspec.

Kris
la source
Je dois utiliser bundle execaprès cela, comment utiliser encore rakesans le bundle exec ??
svelandiag
Pouvez-vous clarifier votre commentaire "Rails 2.3" utilise? Je suis sur Rails 4 et rake db:create:alljette cette exception.
yekta
@yekta Rails 2.3 s'attend à ce que Rake ait une méthode appelée last_comment, où dans la base de code c'est je ne me souviens pas. Je ne sais pas si Rails 4 appelle également last_comment. Mais vous pouvez vérifier la base de code des rails, passer à la branche Rails 4 et grep pour "last_comment" dans Rakefileet *.task.
Kris
7
Merci pour cela, gardez toujours notre bacon en 2017.
Nick Schwaderer
2
@luke rspec 3.5 ou supérieur.
Kris
73

dans Rails, la correction rapide peut être modifiée ./Rakefile(dans le dossier de votre application)

et ajoutez ces lignes avant d'appeler Rails.application.load_tasks:

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

si entier Rakefile pourrait ressembler à

  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
équivalent8
la source
Merci. Plus nécessaire à partir de Rake 11.1.0
sethcall
10
sympa, voilà mes 5 minutes de gloire: D
équivalent 8
3
Il semble que la suppression de a last_comment été annulée et sera désormais supprimée dans rake 12.0 à la place.
Kris
3
Après la mise à niveau vers rake 12.0.0, j'ai commencé à voir cette erreur. Le correctif temporaire de @ équivalent8 a fonctionné pour moi.
blackwood
1
La mise à niveau vers rspec-core-3.5.4 a résolu ce problème pour moi et j'ai pu supprimer le patch monkey dans cette réponse.
neontapir
27

La mise à jour vers la dernière Rspecgemme fait le travail:

bundle update rspec-rails

Gal Bracha
la source
7
Trouver ma propre réponse sur StackOverflow - 3 ans depuis que je l'ai écrit - Fonctionne toujours comme par magie :)
Gal Bracha
3
ce n'est pas "toujours" une bonne solution, cela pourrait installer une version rspec -rails non compatible, il est préférable de toujours spécifier la version à utiliser.
Arnold Roa
21

Améliorez simplement le bijou rspec-rails

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

câlins!

EderCosta
la source
1
gem 'rspec-rails', '~> 3.6'sauvé ma vie, merci beaucoup !! Et je pensais avoir quelque chose comme last_comment dans mon code! LOL
user1735921
20

C'est un problème de rake qui a déjà été résolu.

La réponse par @ équivalent8 est un patch de singe et doit être évité.

Comme le souligne @Kris, il s'agit d'un problème isolé rake 11.0.1 . Depuis que @Kris a publié sa réponse, de nouvelles versions de Rake sont disponibles et, idéalement, vous pourrez rester avec le temps et ne pas être épinglé à une ancienne version de rake. Croyez-moi, j'y suis allé et ce n'est pas une bonne idée si vous pouvez l'aider. Ce n'est pas non plus un problème avec Rails 2.3 ou n'importe quelle version de rails.

Tout râteau < v11.0.1ou> v11.0.1 and < v12 fonctionnera, mais cela reste un travail autour et doit également être évité; idéalement, vous pourrez rester avec le temps.

Étant donné qu'elle last_commentest obsolète, la dépendance elle-même doit être mise à niveau. Dans mon cas, c'est rspec-corece qui n'a corrigé ce problème que dans la v3.4.4 .

Le correctif

Mettez à niveau votre dépendance vers une version qui n'appelle pas last_commentmais qui appelle à la last_descriptionplace. Son probablement rspecet la mise rspec-coreà niveau vers 3.4.4 ou une version supérieure le résoudra. rspec-core<3.4.4 appels last_comment.

Si votre dépendance n'a pas de version qui n'appelle pas last_description, soyez un bon citoyen et soumettez un PR pour le réparer :)

Yekta
la source