Cómo arreglar los mensajes de advertencia de Rails con Ruby 2.7.0

43

¿Alguien resolvió este problema con Ruby 2.7.0?

He utilizado rbenve instalado Rubí v2.7.0 y luego creó un proyecto Rails usando Rails v6.0.2.1.

Actualmente, ejecutando uno de

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

el servidor está activo y el sitio está servido pero en el Consoleregistro veo dos mensajes de advertencia:

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 

Entonces, los mensajes de advertencia son:

**.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
fuente
8
Los argumentos posicionales y los argumentos de palabras clave se deben separar en Ruby 3.0. Esta es una mera advertencia. Rails está lleno de este patrón. ruby-lang.org/en/news/2019/12/12/…
Josh Brody
3
@JoshBrody muchas gracias. Vi este enlace y hay algunas sugerencias para cambiar las advertencias como "Si desea deshabilitar las advertencias de desaprobación, utilice un argumento de línea de comandos -W: no-desaprobado o agregue Advertencia [: desaprobado] = falso a su código. " pero estaba pensando en una solución / solución un poco mejor para actionpack v6.0.2.1
Nezir
Ocultar advertencias de desaprobación en todos los ámbitos es una MALA idea, especialmente cuando desea suavizar sus futuras actualizaciones.
Vlad
1
@Vlad estuvo de acuerdo, pero reducir el ruido de registro temporalmente está bien (si sabes lo que estás haciendo)
Khalil Gharbaoui

Respuestas:

55

Para suprimir advertencias como:

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

Por ahora, simplemente prefija / pase la RUBYOPTvariable de entorno a sus comandos de rails:

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

Esto puede no funcionar con versiones anteriores de ruby.

Para compatibilidad con versiones anteriores de ruby, prefijelo con RUBYOPT='-W0'.

ejemplo:

RUBYOPT='-W0' bundle exec rspec

Si no desea ponerle el prefijo cada vez que ejecuta un comando, simplemente agregue esto a la última línea de su .zshrco .bashrc(lo que sea que esté usando):

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

Vea también el último punto de las notas aquí:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-

Khalil Gharbaoui
fuente
1
Un problema con esto es que las versiones anteriores instaladas de Ruby donde el indicador -W: no en desuso 'no es válido arrojarán un error. Lo arreglé usando export RUBYOPT = '- W0'
Augusto Samamé Barrientos
¿Hay alguna forma de llamar a la tarea que no dará una advertencia, es decir, llamarla de una manera que no esté en desuso?
barlop
@barlop, bueno, no es la tarea que está dando la advertencia. Las advertencias provienen del código subyacente. Básicamente, encontrar las desvalorizaciones si están en su propio código y solucionarlas será suficiente. Y si no son parte de su código, abra problemas o solicite solicitudes en los repositorios de las gemas que está incluyendo y solicite una solución. o simplemente espera a que lo arreglen. Algunas deprecaciones se mencionan aquí: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released y aquí: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui
@KhalilGharbaoui Gracias. Yo sólo did.a insall fresca de Ruby y Rails IIRC pastebin.com/SYjypsrP parece que tengo el último de todos y todo lo que hice fue creado un proyecto en blanco, tratado ayuda rastrillo y tiene la advertencia también con los carriles db: migrate. Creo que debería ir a esos repositorios. rastrillo sobre menciones actionpack. rake db: migrate o rails db: migrate menciona actionpack, activerecord, activemodel. Aunque no son algunos de los nativos de los rieles tan extraños que los rieles la gente no podría hacerlo bien.
barlop
5

Obviamente, el equipo de ruby ​​tardará un tiempo en eliminar toda esta advertencia en la próxima versión de ruby. Por ahora el comando en tu terminal

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

en mi proyecto básico y sencillo de rieles 6.0.2.1 && ruby ​​2.7.0, elimine estas dos líneas de advertencia anteriores en una pregunta.

Además, con comando

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

ocultará advertencias sobre características experimentales.

Puede combinar estos dos en un comando como:

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

Sin embargo, probé estos comandos dentro de mi antiguo proyecto construido con rails 5.2 y ruby ​​2.6.4 más tarde actualizado a rails 6.0.1 y no funcionaron bien para todos los mensajes de advertencia que recibí de diferentes rails Módulos Active * y gemas ruby.

Probablemente necesitaremos algo de tiempo para actualizar el código y las gemas para las últimas novedades.

Nezir
fuente
5

Como es solo una advertencia y no afectará nada. Simplemente puedes suprimirlos. Encontré que la solución 2 es la más adecuada para mí.

Opción 1. Inicie el servidor rails con RUBYOPT='-W:no-deprecated' rails s

Opción 2. Establecer export RUBYOPT='-W:no-deprecateden su perfil bash / zsh

Opción 3. Establecer Warning[:deprecated] = falseen su código ruby

Sajidur Rahman
fuente