Come correggere i messaggi di avviso di Rails con Ruby 2.7.0


43

Qualcuno ha risolto questo problema con Ruby 2.7.0?

Ho usato rbenve installato Ruby v2.7.0 e poi ho creato un progetto Rails usando Rails v6.0.2.1.

Attualmente, eseguendo uno dei

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

il server è attivo e il sito è servito ma nel Consoleregistro vedo due messaggi di avviso:

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 

Quindi, i messaggi di avviso sono:

**.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
Gli argomenti posizionali e gli argomenti delle parole chiave devono essere separati in Ruby 3.0. Questo è un semplice avvertimento. Rails è riempito con questo modello. ruby-lang.org/it/news/2019/12/12/…
Josh Brody il

3
@JoshBrody grazie mille. Ho visto questo link e ci sono alcuni suggerimenti per cambiare gli avvisi come "Se si desidera disabilitare gli avvisi di deprecazione, utilizzare un argomento della riga di comando -W: no-deprecated o aggiungere Warning [: deprecated] = false nel codice. " ma stavo pensando a una soluzione / correzione un po 'migliore per actionpack v6.0.2.1
Nezir

Nascondere gli avvisi di deprecazione su tutta la linea è un'idea MALE, soprattutto quando si desidera appianare gli aggiornamenti futuri.
Vlad

1
@Vlad concordato ma ridurre temporaneamente il rumore del log è ok (se sai cosa stai facendo)
Khalil Gharbaoui

Risposte:


55

Per eliminare gli avvisi come:

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

Per ora, aggiungi semplicemente il prefisso / passa la RUBYOPTvariabile d'ambiente ai tuoi comandi rails:

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

Questo potrebbe non funzionare con le versioni precedenti di ruby.

Per compatibilità con le versioni precedenti di Ruby, esegui il prefisso con RUBYOPT='-W0' invece .

esempio:

RUBYOPT='-W0' bundle exec rspec

Se non si desidera aggiungere un prefisso ogni volta che si esegue un comando, è sufficiente aggiungerlo all'ultima riga del proprio .zshrco .bashrc(qualunque cosa si stia utilizzando):

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

Vedi anche l'ultimo punto delle note qui:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-


1
Un problema è che le versioni precedenti installate di Ruby in cui il flag -W: no-deprecated 'non è valido genereranno un errore. Ho risolto questo problema usando export RUBYOPT = '- W0'
Augusto Samamé Barrientos

C'è un modo per chiamare l'attività che non darà un avvertimento, cioè chiamarlo in un modo che non è deprecato?
barlop

@barlop bene non è il compito che sta dando l'avvertimento. Gli avvisi provengono dal codice sottostante. Fondamentalmente trovare le deprecazioni se sono nel tuo codice e correggerle farà. E se non fanno parte del tuo codice, apri i problemi o tira richieste sui repository delle gemme che stai includendo e chiedi loro una soluzione. o aspetta semplicemente che lo risolvano. Alcune deprecazioni sono menzionate qui: ruby-lang.org/it/news/2019/12/25/ruby-2-7-0-released e qui: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui

@KhalilGharbaoui Grazie. Ho appena fatto un nuovo insall di ruby ​​e rails iirc pastebin.com/SYjypsrP sembra che io abbia l'ultimo di ognuno e tutto quello che ho fatto è stato creare un progetto vuoto, ho provato aiuto rake e ho ricevuto l'avvertimento anche con rails db: migrate. Immagino che dovrei andare su quei repository. rake about menzioni actionpack. rake db: migrate o rails db: migrate menziona actionpack, activerecord, activemodel. Anche se alcuni di quelli non sono nemmeno nativi delle rotaie così strani che le persone non riescono a farlo bene.
barlop

5

Ovviamente ci vorrà del tempo perché il team di ruby ​​rimuova tutti questi avvisi nella prossima versione di ruby. Per ora il comando nel tuo terminale

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

sul mio progetto di base, chiaramente nuovo, rotaie 6.0.2.1 && ruby ​​2.7.0 rimuovi queste due linee di avvertenza sopra in una domanda.

Inoltre, con comando

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

nasconderai avvisi sulle funzionalità sperimentali.

Puoi combinare questi due in un solo comando come:

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

Tuttavia, ho provato questi comandi all'interno del mio vecchio progetto costruito con rails 5.2 e ruby ​​2.6.4 successivamente aggiornato a rails 6.0.1 e non hanno funzionato bene su tutti i messaggi di avviso che ho ricevuto da diversi moduli Active * rails e gemme ruby.

Probabilmente avremo bisogno di un po 'di tempo per aggiornare il codice e le gemme per le ultime novità.


5

Come è solo un avvertimento e non influenzerà nulla. Puoi semplicemente sopprimerli. Ho trovato la soluzione 2 adatta a me.

Opzione 1. Avviare il server rails con RUBYOPT='-W:no-deprecated' rails s

Opzione 2. Imposta export RUBYOPT='-W:no-deprecated nel profilo bash / zsh

Opzione 3. Imposta il Warning[:deprecated] = falsetuo codice ruby

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.