Como corrigir as mensagens de aviso do Rails com o Ruby 2.7.0

43

Alguém resolveu esse problema Ruby 2.7.0?

Eu usei rbenve instalei o Ruby v2.7.0 e criei um projeto Rails usando Rails v6.0.2.1.

Atualmente, executando um dos

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

o servidor está ativo e o site é veiculado, mas no Consolelog eu vejo duas mensagens de aviso:

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 

Portanto, as mensagens de aviso são:

**.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**
Nezir
fonte
8
Argumentos posicionais e argumentos de palavras-chave devem ser separados no Ruby 3.0. Este é um mero aviso. O Rails é preenchido com esse padrão. Ruby-lang.org/pt/news/2019/12/12/…
Josh Brody
3
@ JoshBrody muito obrigado. Eu vi esse link e há algumas sugestões para alternar avisos como "Se você deseja desativar os avisos de descontinuação, use o argumento da linha de comando -W: no-descontinuado ou adicione Aviso [: descontinuado] = false ao seu código. " mas eu estava pensando em uma solução / correção um pouco melhor para o actionpack v6.0.2.1
Nezir 27/12/19
Ocultar avisos de descontinuação em geral é uma má idéia, especialmente quando você deseja suavizar suas futuras atualizações.
Vlad
11
@Vlad concordou, mas reduzindo log ruído temporariamente é ok (se você sabe o que está fazendo)
Khalil Gharbaoul

Respostas:

55

Para suprimir avisos como:

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

Por enquanto, basta prefixar / passar a RUBYOPTvariável de ambiente para seus comandos rails:

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

Isso pode não funcionar com versões anteriores do ruby.

Para compatibilidade com versões anteriores de versões anteriores do ruby, prefixe-o RUBYOPT='-W0'.

exemplo:

RUBYOPT='-W0' bundle exec rspec

Se você não quiser prefixar isso sempre que executar um comando, basta adicioná-lo à última linha do seu .zshrcou .bashrc(o que você estiver usando):

export RUBYOPT='-W:no-deprecated -W:no-experimental'
ou
export RUBYOPT='-W0'

Consulte também o último ponto das notas aqui:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-

Khalil Gharbaoui
fonte
11
Um problema é que as versões anteriores instaladas do Ruby, nas quais o sinalizador -W: no-deprecated 'não é válido, geram um erro. Corrigi isso usando exportação RUBYOPT = '- W0'
Augusto Samamé Barrientos
Existe uma maneira de chamar a tarefa que não emitirá um aviso, ou seja, de uma maneira que não seja preterida?
barlop 22/04
@ Barlop bem, não é a tarefa que está dando o aviso. Os avisos vêm do código subjacente. Basicamente, encontrar as substituições se elas estiverem no seu próprio código e corrigi-las. E se eles não fazem parte do seu código, abra problemas ou solicite solicitações nos repositórios de gemas que você está incluindo e peça uma correção. ou apenas espere que eles consertem. Algumas preterições são mencionadas aqui: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released e aqui: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui
@KhalilGharbaoui Thanks. Acabei de fazer. Um novo insall de ruby ​​e rails iirc pastebin.com/SYjypsrP parece que tenho o mais recente de cada um e tudo o que fiz foi criar um projeto em branco, tentar ajuda com rake e receber o aviso também com o rails db: migrate. Eu acho que eu deveria ir nesses repos. rake sobre menções actionpack. rake db: migrate ou rails db: migrate menciona actionpack, activerecord, activeemodel. Embora alguns dos nativos dos trilhos não sejam tão estranhos que as pessoas não pudessem acertar.
barlop 22/04
5

Obviamente, levará algum tempo para a equipe do ruby ​​remover todo esse aviso na próxima versão do ruby. Por enquanto o comando no seu terminal

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

no meu projeto básico e simples dos novos trilhos 6.0.2.1 && ruby ​​2.7.0, remova essas duas linhas de avisos acima em uma pergunta.

Além disso, com o comando

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

você ocultará avisos sobre recursos experimentais.

Você pode combinar esses dois em um comando como:

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

No entanto, tentei esses comandos dentro do meu projeto antigo, construído com o Rails 5.2 e o Ruby 2.6.4 posteriormente, atualizado para o Rails 6.0.1 e eles não funcionaram bem em todas as mensagens de aviso que recebi dos diferentes módulos Active * do rails e ruby ​​gems.

Provavelmente precisaremos de algum tempo para atualizar o código e as gemas para obter as novidades mais recentes.

Nezir
fonte
5

Como é apenas um aviso e não afetará nada. Você pode simplesmente suprimi-los. Eu achei a solução 2 a mais adequada para mim.

Opção 1. Inicie o servidor rails com RUBYOPT='-W:no-deprecated' rails s

Opção 2. Defina export RUBYOPT='-W:no-deprecatedno seu perfil bash / zsh

Opção 3. Defina Warning[:deprecated] = falseno seu código ruby

Sajidur Rahman
fonte