Cara memperbaiki pesan peringatan Rails dengan Ruby 2.7.0


43

Adakah yang bisa mengatasi masalah ini Ruby 2.7.0?

Saya menggunakan rbenvdan menginstal Ruby v2.7.0 dan kemudian membuat proyek Rails menggunakan Rails v6.0.2.1.

Saat ini, dengan menjalankan salah satu

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

server sudah habis dan situs dilayani tetapi dalam Consolelog saya melihat dua pesan peringatan:

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 

Jadi, pesan peringatannya adalah:

**.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
Argumen posisi dan argumen kata kunci harus dipisahkan dalam Ruby 3.0. Ini hanyalah peringatan. Rel diisi dengan pola ini. ruby-lang.org/en/news/2019/12/12/…
Josh Brody

3
@ Josh Brody terima kasih banyak. Saya melihat tautan ini dan ada beberapa saran untuk mengganti peringatan seperti "Jika Anda ingin menonaktifkan peringatan penghentian, silakan gunakan argumen baris perintah -W: no-deprecated atau tambahkan Warning [: deprecated] = false ke kode Anda. " tapi saya berpikir tentang solusi / perbaikan sedikit lebih baik untuk actionpack v6.0.2.1
Nezir

Menyembunyikan peringatan penghentian di papan tulis adalah ide yang BURUK, terutama ketika Anda ingin memperlancar pembaruan masa depan Anda.
Vlad

1
@Vlad setuju tetapi mengurangi kebisingan log sementara tidak masalah (jika Anda tahu apa yang Anda lakukan)
Khalil Gharbaoui

Jawaban:


55

Untuk menekan peringatan seperti:

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

Untuk saat ini, cukup awali / lulus RUBYOPTvariabel lingkungan ke perintah rails Anda:

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

Ini mungkin tidak berfungsi dengan versi ruby ​​yang lebih lama.

Untuk kompatibilitas dengan versi awalan ruby ​​sebelumnya dengan itu RUBYOPT='-W0'.

contoh:

RUBYOPT='-W0' bundle exec rspec

Jika Anda tidak ingin awalan ini setiap kali Anda menjalankan perintah, cukup tambahkan ini ke baris terakhir Anda .zshrcatau .bashrc(apa pun yang Anda gunakan):

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

Juga lihat poin terakhir dari catatan di sini:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-


1
Salah satu masalah dengan ini adalah bahwa menginstal versi Ruby sebelumnya di mana -W: no-deprecated 'flag tidak valid akan menimbulkan kesalahan. Saya memperbaikinya dengan menggunakan ekspor RUBYOPT = '- W0'
Augusto Samamé Barrientos

Apakah ada cara untuk memanggil tugas yang tidak akan memberikan peringatan, yaitu untuk memanggilnya dengan cara yang tidak usang?
barlop

@barlop juga bukan tugas yang memberi peringatan. Peringatan datang dari kode yang mendasarinya. Pada dasarnya menemukan penghentian jika mereka ada dalam kode Anda sendiri dan memperbaikinya akan dilakukan. Dan jika mereka bukan bagian dari kode Anda maka buka masalah atau tarik permintaan pada repo permata yang Anda sertakan dan minta mereka untuk memperbaikinya. atau hanya menunggu mereka untuk memperbaikinya. Beberapa penghinaan disebutkan di sini: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released dan di sini: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui

@KhalilGharbaoui Terima kasih. Saya baru saja melakukannya. Insall ruby ​​dan rail baru iirc pastebin.com/SYjypsrP sepertinya saya punya yang terbaru dan semua yang saya lakukan adalah membuat proyek kosong, mencoba menyapu bantuan dan mendapat peringatan juga dengan rail db: migrate. Saya kira saya harus pergi ke repo itu. rake tentang menyebutkan actionpack. rake db: migrate or rails db: migrate menyebutkan actionpack, activerecord, activemodel. Meskipun beberapa dari mereka bahkan tidak asli dari rel begitu aneh bahwa rel orang tidak bisa memperbaikinya.
barlop

5

Jelas akan membutuhkan waktu bagi tim ruby ​​untuk menghapus semua peringatan ini dalam versi ruby ​​berikutnya. Untuk saat ini perintah di terminal Anda

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

pada proyek dasar, rel baru 6.0.2.1 && ruby ​​2.7.0 saya menghapus dua baris peringatan di atas dalam sebuah pertanyaan.

Juga, dengan perintah

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

Anda akan menyembunyikan peringatan tentang fitur eksperimental.

Anda dapat menggabungkan kedua perintah ini dalam satu seperti:

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

Namun, saya mencoba perintah-perintah ini di dalam proyek lama saya yang dibangun dengan rail 5.2 dan ruby ​​2.6.4 kemudian ditingkatkan menjadi rail 6.0.1 dan mereka tidak bekerja dengan baik untuk semua pesan peringatan yang saya dapatkan dari modul Active * rail yang berbeda dan permata ruby.

Mungkin kita perlu waktu untuk meningkatkan kode dan permata untuk hal-hal baru terbaru.


5

Sebagai peringatan saja dan tidak akan mempengaruhi apa pun. Anda cukup menekannya. Saya menemukan solusi 2 yang cocok untuk saya.

Opsi 1. Mulai server rel dengan RUBYOPT='-W:no-deprecated' rails s

Opsi 2. Atur export RUBYOPT='-W:no-deprecateddi profil bash / zsh Anda

Opsi 3. Atur Warning[:deprecated] = falsedalam kode ruby ​​Anda

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.