Как исправить предупреждающие сообщения Rails с Ruby 2.7.0


43

Кто-нибудь решил эту проблему с Ruby 2.7.0?

Я использовал rbenvи установил Ruby v2.7.0, а затем создал проект Rails, используя Rails v6.0.2.1.

В настоящее время, запустив один из

rails s
rails s -u puma
rails s -u webrick

сервер работает и сайт обслуживается, но в Consoleжурнале я вижу два предупреждающих сообщения:

local:~/rcode/rb27$ rails s
=> Booting Puma
=> Rails 6.0.2.1 application starting in development 
=> Run `rails server --help` for more startup options
.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call
.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here
Puma starting in single mode...
* Version 4.3.1 (ruby 2.7.0-p0), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
* Listening on tcp://[::1]:3000 

Итак, предупреждающие сообщения:

**.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/stack.rb:37: warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call**

**.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/actionpack-6.0.2.1/lib/action_dispatch/middleware/static.rb:110: warning: The called method `initialize' is defined here**

8
Позиционные аргументы и ключевые аргументы должны быть разделены в Ruby 3.0. Это всего лишь предупреждение. Рельсы заполнены этим шаблоном. ruby-lang.org/en/news/2019/12/12/…
Джош Броди

3
@JoshBrody большое спасибо. Я видел эту ссылку, и есть некоторые предложения по переключению предупреждений, например «Если вы хотите отключить предупреждения об устаревании, используйте аргумент командной строки -W: no-deprecated или добавьте Warning [: deprecated] = false в ваш код. " но я думал о немного лучшем решении / исправлении для actionpack v6.0.2.1
Nezir

Скрывать предупреждения об устаревании по всем направлениям - ПЛОХАЯ идея, особенно когда вы хотите сгладить ваши будущие обновления.
Влад

1
@ Влад согласился, но временно уменьшить шум от бревен (если вы знаете, что делаете)
Халил Гарбауи,

Ответы:


55

Для подавления таких предупреждений, как:

warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call

Сейчас просто добавьте префикс / передать RUBYOPTпеременную окружения в ваши команды rails:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails server
или
RUBYOPT='-W:no-deprecated -W:no-experimental' rails db:migrate

Это может не работать с более ранними версиями ruby.

Для обратной совместимости с более ранними версиями ruby RUBYOPT='-W0'вместо этого используйте префикс .

пример:

RUBYOPT='-W0' bundle exec rspec

Если вы не хотите добавлять префикс при каждом запуске команды, просто добавьте это в последнюю строку вашего .zshrcили .bashrc(что бы вы ни использовали):

export RUBYOPT='-W:no-deprecated -W:no-experimental'
или
export RUBYOPT='-W0'

Также см. Последний пункт примечаний здесь:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-


1
Одна из проблем заключается в том, что установленные в предыдущих версиях Ruby, где флаг -W: no-deprecated 'недопустим, выдаст ошибку. Я исправил это с помощью экспорта RUBYOPT = '- W0'
Augusto Samamé Barrientos

Есть ли способ вызвать задачу, которая не выдаст предупреждение, т. Е. Вызвать ее способом, который не считается устаревшим?
Бароп

@ barlop ну это не задача, которая дает предупреждение. Предупреждения исходят из основного кода. По сути, найдутся амортизации, если они есть в вашем собственном коде, и исправление их. И если они не являются частью вашего кода, то откройте проблемы или вытяните запросы на репозитории драгоценных камней, которые вы включаете, и попросите их исправить. или просто подождите, пока они это исправят. Некоторые амортизации упоминаются здесь: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released и здесь: rubyreferences.github.io/rubychanges/2.7.html
Халил Гарбауи,

@KhalilGharbaoui Спасибо. Я только что сделал. Свежее знакомство с ruby ​​и rails iirc pastebin.com/SYjypsrP выглядит так, как будто у меня есть последние из них, и все, что я сделал, это создал пустой проект, попытался получить помощь по рейку и получил предупреждение также с rails db: migrate. Думаю, мне стоит пойти на эти репо. грабли про упомянутый actionpack. rake db: migrate или rails db: migrate упоминает пакет действий, activerecord, activemodel. Хотя некоторые из тех, кто даже родом из рельсов, не настолько странны, что люди из рельсов не могли понять это правильно.
Бароп

5

Очевидно, что команде ruby ​​потребуется некоторое время, чтобы удалить все это предупреждение в следующей версии ruby. А пока команда в вашем терминале

`RUBYOPT='-W:no-deprecated' rails s` 

на моем простом, новом проекте rails 6.0.2.1 && ruby ​​2.7.0 удалите эти две строки предупреждений выше в вопросе.

Также с помощью команды

RUBYOPT='-W:no-experimental' rails s

Вы будете скрывать предупреждения об экспериментальных особенностях.

Вы можете объединить эти два в одну команду как:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails s

Тем не менее, я попробовал эти команды в моем старом проекте, построенном с rails 5.2 и ruby ​​2.6.4, позже обновленным до rails 6.0.1, и они не сработали хорошо для всех предупреждений, которые я получил от различных модулей rails Active * и гемов ruby.

Вероятно, нам понадобится некоторое время для обновления кода и гемов для новых последних вещей.


5

Так как это всего лишь предупреждение, оно ни на что не повлияет. Вы можете просто подавить их. Я нашел решение 2, которое подходит мне.

Вариант 1. Запустите сервер rails с RUBYOPT='-W:no-deprecated' rails s

Вариант 2. Установите export RUBYOPT='-W:no-deprecatedв своем профиле bash / zsh

Вариант 3. Установите Warning[:deprecated] = falseв своем рубиновом коде

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.