NoMethodError: невизначений метод `last_comment 'після оновлення до рейкової 11


130

Під час виконання будь-якого rakeзавдання я отримую:

NoMethodError: невизначений метод `last_comment 'для

Це було після bundle updateчого витягнув нову версію граблі, версію 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 :: Застосування: 0x007ff0cf37be38>

Версії

  • Рейки 3.2.11
  • Граблі 11.0.1

Відповіді:


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)

Зараз ми використовуємо граблі 10.5.0, у яких все ще є last_commentметод, і наші rakeзавдання працюватимуть знову.

ОНОВЛЕННЯ : Тепер це було виправлено у rspec, тому єдине, що потрібно, - це оновлення rspec.


Я повинен використовувати bundle execпісля цього, як просто все-таки використовувати rakeбез exec в комплекті ??
svelandiag

Чи можете ви уточнити, що ваш "Рейки 2.3" використовує коментар? Я на Rails 4 і rake db:create:allкидає цей виняток.
yekta

@yekta Rails 2.3 очікує, що у Rake з'явиться метод, який називається last_comment, де в кодовій базі це не я пам’ятаю. Я не знаю, чи також телефонує Rails 4 last_comment. Але ви можете перевірити кодову базу рейок, перейти на гілку Rails 4 та перейти на "last_comment" у Rakefileта *.task.
Кріс

7
Дякую за це, все-таки рятуючи наш бекон у 2017 році
Нік Швадерер,

2
@luke rspec 3.5 або новішої версії
Кріс

73

у 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

Дякую. Більше не потрібно з Rake 11.1.0
sethcall

10
приємно, проходить мої 5 хвилин слави: D
еквівалент88

3
Схоже, вилучення last_comment повернуто назад і тепер замість нього буде видалено граблі 12.0.
Крис

3
Після оновлення до граблі 12.0.0 я почав бачити цю помилку. Температура @ ekvivalent8 працювала на мене.
чорне дерево

1
Оновлення до rspec-core-3.5.4 вирішило це для мене, і я зміг видалити патч мавпи в цій відповіді.
неонапір

27

Оновлення до останнього Rspecдорогоцінного каміння спрацьовує так:

bundle update rspec-rails


7
Пошук власної відповіді на StackOverflow - 3 роки відтоді, як я її написав - Все ще працює як магія :)
Гал Брача

3
це не завжди «гарне рішення», це може встановити несумісну версію rspec -rails, краще завжди вказати версію, яку слід використовувати.
Арнольд Роа

21

Просто оновіть дорогоцінний камінь rspec-rails

Зараз: gem 'rspec-rails', '~> 3.5', '>= 3.5.2'

обійми!


1
gem 'rspec-rails', '~> 3.6'врятував моє життя, велике спасибі !! І я думав, що у мене в коді є щось на кшталт last_comment! LOL
користувач1735921

20

Це питання у рейках, яке вже було вирішено.

Відповідь @ еквівалент8 - це патч мавп, якого слід уникати.

Як вказує @Kris, це питання, яке вирішено окремо rake 11.0.1. Оскільки @Kris опублікував свою відповідь, доступні нові версії Rake, і в ідеалі ви зможете бути в курсі часів і не бути прив’язаними до старої версії граблі. Повірте, я там був, і це не дуже гарна ідея, якщо ви можете допомогти. Також це не проблема з рейками 2.3 або будь-якою версією рейок.

Будь-яка рейка < 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, щоб виправити це :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.