NoMethodError: método indefinido `last_comment 'após atualizar para o rake 11

130

Ao executar qualquer raketarefa, recebo:

NoMethodError: método indefinido `last_comment 'para

Foi depois disso bundle updateque surgiu a nova versão do rake, versão 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étodo indefinido `last_comment 'para # <Rake :: Application: 0x007ff0cf37be38>

Versões

  • Rails 3.2.11
  • Rake 11.0.1
Kris
fonte

Respostas:

159

O Rake 11.0.1 remove o last_commentmétodo queRails 2.3O rspec-core (<3.4.4) usa. Portanto, até / se um patch for lançado, precisamos fixar o rake para uma versão mais antiga no Gemfile:

gem 'rake', '< 11.0'

então:

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

Agora estamos usando o rake 10.5.0, que ainda possui o last_commentmétodo e nossas raketarefas funcionarão novamente.

ATUALIZAÇÃO : Agora isso foi corrigido no rspec, portanto, a única coisa necessária deve ser a atualização do rspec.

Kris
fonte
Eu tenho que usar bundle execdepois de fazer isso, como apenas ainda usar rakesem o exec bundle?
Svelandiag
Você pode esclarecer que o "Rails 2.3" usa comentários? Estou no Rails 4 e a rake db:create:alllança essa exceção.
Yekta
O @yekta Rails 2.3 espera que o Rake tenha um método chamado last_comment, onde na base de código isso não me lembro. Não sei se o Rails 4 também chama last_comment. Mas você pode verificar a base de código do Rails, alternar para o ramo Rails 4 e grep para "last_comment" em Rakefilee *.task.
Kris
7
Obrigado por isso, ainda salvar nosso bacon em 2017.
Nick Schwaderer
2
@luke rspec 3.5 ou superior.
21418 Kris
73

a correção rápida do Rails pode ser editada ./Rakefile(na pasta do aplicativo)

e adicione estas linhas antes de chamar Rails.application.load_tasks:

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

tão inteiro Rakefilepode parecer

  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
equivalente8
fonte
Obrigado. Não é mais necessário a partir do Rake 11.1.0
sethcall 13/03
10
bom, lá se vai a meus 5 minutos de fama: D
equivalent8
3
Parece que a remoção de last_comment foi revertida e agora será removida no rake 12.0.
Kris18:
3
Após a atualização para o rake 12.0.0, comecei a ver esse erro. A correção temporária de @ equival8 funcionou para mim.
blackwood
1
A atualização para o rspec-core-3.5.4 resolveu isso para mim e eu pude remover o patch de macaco nesta resposta.
precisa saber é
27

A atualização para a Rspecgema mais recente faz o trabalho:

bundle update rspec-rails

Gal Bracha
fonte
7
Encontrar a minha própria resposta na StackOverflow - 3 anos desde que eu escrevi isso - Ainda funciona como mágica :)
Gal Bracha
3
isso não é "sempre" uma boa solução, isso pode instalar uma versão rspec -rails não compatível; é melhor sempre especificar a versão a ser usada.
Arnold Roa
21

Basta atualizar a gema rspec-rails

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

abraços!

EderCosta
fonte
1
gem 'rspec-rails', '~> 3.6'salvou minha vida, muito obrigado !! E eu pensei que eu tinha algo como last_comment dentro do meu código! LOL
user1735921
20

Este é um problema no rake que já foi abordado.

A resposta de @ equivalente8 é um patch de macaco e deve ser evitada.

Como o @Kris aponta, esse é um problema isolado rake 11.0.1. Como o @Kris postou sua resposta, há novas versões do Rake disponíveis e, idealmente, você poderá acompanhar os horários e não ficar preso a uma versão antiga do rake. Acredite, eu já estive lá e não é uma boa ideia se você pode ajudar. Além disso, este não é um problema no Rails 2.3 ou em qualquer versão do Rails.

Qualquer rake < v11.0.1ou > v11.0.1 and < v12funcionará, mas isso ainda é uma solução alternativa e também deve ser evitado; idealmente, você poderá ficar com os horários.

Como last_commentestá sendo preterido, a dependência em si deve ser atualizada. No meu caso, foi o rspec-coreque aliás corrigiu isso apenas na v3.4.4 .

O conserto

Atualize sua dependência para uma versão que não chama, last_commentmas chama last_description. Provavelmente, a rspecatualização rspec-corepara 3.4.4 ou superior o corrigirá. rspec-core<3.4.4 chamadas last_comment.

Se a sua dependência não possui uma versão que não chama last_description, seja um bom cidadão e envie um PR para corrigi-lo :)

yekta
fonte