Comment réparer les messages d'avertissement de Rails avec Ruby 2.7.0

43

Quelqu'un a-t-il résolu ce problème avec Ruby 2.7.0?

J'ai utilisé rbenvet installé Ruby v2.7.0 puis créé un projet Rails à l'aide Rails v6.0.2.1.

Actuellement, en exécutant l'un des

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

le serveur est en place et le site est servi mais dans le Consolejournal je vois deux messages d'avertissement:

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 

Ainsi, les messages d'avertissement sont:

**.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
la source
8
Les arguments positionnels et les arguments de mots clés doivent être séparés dans Ruby 3.0. Ceci est un simple avertissement. Rails est rempli de ce motif. ruby-lang.org/en/news/2019/12/12/…
Josh Brody
3
@JoshBrody merci beaucoup. J'ai vu ce lien et il est suggéré de désactiver les avertissements du type "Si vous souhaitez désactiver les avertissements de dépréciation, veuillez utiliser un argument de ligne de commande -W: no-deprecated ou ajouter Warning [: deprecated] = false à votre code. " mais je réfléchissais à une solution / correction un peu meilleure pour actionpack v6.0.2.1
Nezir
Masquer les avertissements de dépréciation à tous les niveaux est une mauvaise idée, surtout lorsque vous souhaitez lisser vos futures mises à niveau.
Vlad
1
@Vlad a accepté, mais réduire temporairement le bruit des journaux est correct (si vous savez ce que vous faites)
Khalil Gharbaoui

Réponses:

55

Pour supprimer des avertissements tels que:

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

Pour l'instant, il suffit de préfixer / passer la RUBYOPTvariable d'environnement à vos commandes rails:

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

Cela peut ne pas fonctionner avec les versions antérieures de ruby.

Pour une compatibilité descendante avec les versions antérieures de ruby, préfixez-le à la RUBYOPT='-W0'place.

exemple:

RUBYOPT='-W0' bundle exec rspec

Si vous ne voulez pas préfixer cela à chaque fois que vous exécutez une commande, ajoutez simplement ceci à la dernière ligne de votre .zshrcou .bashrc(quoi que vous utilisiez):

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

Voir également le dernier point des notes ici:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-

Khalil Gharbaoui
la source
1
Un problème avec cela est que les versions précédentes installées de Ruby où l'indicateur -W: no-deprecated 'n'est pas valide lèveront une erreur. J'ai corrigé cela en utilisant l'export RUBYOPT = '- W0'
Augusto Samamé Barrientos
Existe-t-il un moyen d'appeler la tâche qui ne donnera pas d'avertissement, c'est-à-dire de l'appeler d'une manière qui n'est pas déconseillée?
barlop
@barlop et bien ce n'est pas la tâche qui donne l'avertissement. Les avertissements proviennent du code sous-jacent. Fondamentalement, trouver les dépréciations si elles sont dans votre propre code et les corriger fera l'affaire. Et s'ils ne font pas partie de votre code, ouvrez des problèmes ou envoyez des demandes sur les dépôts des gemmes que vous incluez et demandez-leur un correctif. ou attendez simplement qu'ils le réparent. Certaines dépréciations sont mentionnées ici: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released et ici: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui
@KhalilGharbaoui Merci. Je viens did.a frais insall de rubis et des rails IIRC pastebin.com/SYjypsrP semble que j'ai le dernier de chacun et de tout ce que je l' ai été créé un projet vide, l' aide de rake essayé et a obtenu l'avertissement aussi avec des rails db: migrate. Je suppose que je devrais aller sur ces repos. rake about mentionne actionpack. rake db: migrate ou rails db: migrate mentionne actionpack, activerecord, activemodel. Bien que certains de ceux qui ne sont même pas originaires des rails ne soient pas si étranges que les gens de rails ne pouvaient pas faire les choses correctement.
barlop le
5

Évidemment, il faudra un certain temps à l'équipe de rubis pour supprimer tous ces avertissements dans la prochaine version de rubis. Pour l'instant la commande dans votre terminal

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

sur mon projet basique et simple de rails 6.0.2.1 && ruby ​​2.7.0, supprimez ces deux lignes d'avertissement ci-dessus dans une question.

Aussi, avec la commande

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

vous masquerez les avertissements concernant les fonctionnalités expérimentales.

Vous pouvez combiner ces deux commandes en une comme:

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

Cependant, j'ai essayé ces commandes à l'intérieur de mon ancien projet construit avec rails 5.2 et ruby ​​2.6.4 mis à niveau plus tard vers rails 6.0.1 et elles n'ont pas bien fonctionné pour tous les messages d'avertissement que j'ai reçus de différents modules rails actifs * et rubis gemmes.

Nous aurons probablement besoin d'un peu de temps pour mettre à niveau le code et les gemmes pour les dernières nouveautés.

Nezir
la source
5

Comme c'est juste un avertissement et n'affectera rien. Vous pouvez simplement les supprimer. J'ai trouvé que la solution 2 me convenait parfaitement.

Option 1. Démarrez le serveur rails avec RUBYOPT='-W:no-deprecated' rails s

Option 2. Définissez export RUBYOPT='-W:no-deprecatedvotre profil bash / zsh

Option 3. Définissez Warning[:deprecated] = falsevotre code rubis

Sajidur Rahman
la source