Cách sửa tin nhắn cảnh báo của Rails với Ruby 2.7.0


43

Có ai giải quyết vấn đề này với Ruby 2.7.0?

Tôi đã sử dụng rbenvvà cài đặt Ruby v2.7.0 và sau đó tạo dự án Rails bằng cách sử dụng Rails v6.0.2.1.

Hiện tại, bằng cách chạy một trong

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

máy chủ hoạt động và trang web được phục vụ nhưng trong Consolenhật ký tôi thấy hai thông báo cảnh báo:

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 

Vì vậy, các thông điệp cảnh báo là:

**.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
Đối số vị trí và đối số từ khóa sẽ được phân tách trong Ruby 3.0. Đây chỉ là một cảnh báo. Rails được lấp đầy với mô hình này. ruby-lang.org/vi/news/2019/12/12/ Cách
Josh Brody

3
@JoshBrody cảm ơn bạn rất nhiều. Tôi thấy liên kết này và có một số gợi ý để chuyển cảnh báo như "Nếu bạn muốn vô hiệu hóa các cảnh báo không dùng nữa, vui lòng sử dụng đối số dòng lệnh -W: no-deprecated hoặc thêm Cảnh báo [: deprecated] = false vào mã của bạn. " nhưng tôi đã suy nghĩ về giải pháp / sửa lỗi tốt hơn một chút cho actionpack v6.0.2.1
Nezir

Ẩn các cảnh báo khấu hao trên bảng là một ý tưởng BAD, đặc biệt là khi bạn muốn làm mượt các nâng cấp trong tương lai của mình.
Vlad

1
@Vlad đồng ý nhưng giảm tiếng ồn đăng nhập tạm thời vẫn ổn (nếu bạn biết bạn đang làm gì)
Khalil Gharbaoui

Câu trả lời:


54

Để ngăn chặn các cảnh báo như:

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

Hiện tại, chỉ cần tiền tố / chuyển RUBYOPTbiến môi trường cho các lệnh rails của bạn:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails server
hoặc là
RUBYOPT='-W:no-deprecated -W:no-experimental' rails db:migrate

Điều này có thể không hoạt động với các phiên bản trước của ruby.

Để tương thích ngược với các phiên bản trước của tiền tố ruby, RUBYOPT='-W0'thay vào đó.

thí dụ:

RUBYOPT='-W0' bundle exec rspec

Nếu bạn không muốn tiền tố này mỗi khi bạn chạy một lệnh, thì chỉ cần thêm nó vào dòng cuối cùng của bạn .zshrchoặc .bashrc(bất cứ điều gì bạn đang sử dụng):

export RUBYOPT='-W:no-deprecated -W:no-experimental'
hoặc là
export RUBYOPT='-W0'

Đồng thời xem điểm cuối của ghi chú tại đây:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-


1
Một vấn đề với điều này là các phiên bản trước của Ruby đã cài đặt trong đó cờ -W: không phản đối 'không hợp lệ sẽ gây ra lỗi. Tôi đã sửa lỗi này bằng cách sử dụng RUBYOPT = '- W0'
Augusto Samamé Barrientos

Có cách nào để gọi nhiệm vụ sẽ không đưa ra cảnh báo, tức là gọi nó theo cách không được tán thành?
barlop

@barlop, đó không phải là nhiệm vụ đưa ra cảnh báo. Các cảnh báo đến từ mã cơ bản. Về cơ bản việc tìm kiếm sự phản đối nếu chúng nằm trong mã của riêng bạn và sửa chúng sẽ làm được. Và nếu chúng không phải là một phần của mã của bạn thì hãy mở các vấn đề hoặc kéo các yêu cầu trên kho của các viên đá quý bạn đang đưa vào và yêu cầu chúng sửa chữa. hoặc chỉ chờ họ sửa nó. Một số sự phản đối được đề cập ở đây: ruby-lang.org/en/news/2019/12/25/ruby-2-7-0- phát hành và ở đây: rubyreferences.github.io/rubychanges/2.7.html
Khalil Gharbaoui

@KhalilGharbaoui Cảm ơn. Tôi chỉ did.a insall tươi của Ruby và Rails iirc pastebin.com/SYjypsrP trông giống như tôi có mới nhất của mỗi và tất cả những gì đã làm được tạo ra một dự án trống, cố gắng cào giúp đỡ và nhận được cảnh báo cũng với đường ray db: di chuyển. Tôi đoán tôi nên đi trên những repos đó. cào về đề cập hành động. rake db: di chuyển hoặc rails db: di chuyển đề cập đến gói hành động, activerecord, activemodel. Mặc dù không có một số người thậm chí có nguồn gốc từ đường ray kỳ lạ đến nỗi người đi đường ray không thể hiểu đúng.
barlop

5

Rõ ràng sẽ mất một thời gian để đội ruby ​​xóa tất cả cảnh báo này trong phiên bản ruby ​​tiếp theo. Bây giờ lệnh trong thiết bị đầu cuối của bạn

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

trên đường ray cơ bản, đơn giản, mới 6.0.2.1 && ruby ​​2.7.0, loại bỏ hai dòng cảnh báo ở trên trong một câu hỏi.

Ngoài ra, với lệnh

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

bạn sẽ ẩn các cảnh báo về các tính năng thử nghiệm.

Bạn có thể kết hợp hai trong một lệnh như sau:

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

Tuy nhiên, tôi đã thử các lệnh này trong dự án cũ của tôi được xây dựng bằng rails 5.2 và ruby ​​2.6.4 sau đó được nâng cấp lên ray 6.0.1 và chúng không hoạt động tốt đối với tất cả các thông báo cảnh báo tôi nhận được từ các mô-đun Active * khác nhau và đá quý ruby.

Có lẽ chúng ta sẽ cần một chút thời gian để nâng cấp mã và đá quý cho những thứ mới nhất.


5

Vì nó chỉ là một cảnh báo và sẽ không ảnh hưởng đến bất cứ điều gì. Bạn chỉ có thể đơn giản là đàn áp họ. Tôi tìm thấy giải pháp 2 là phù hợp với tôi.

Tùy chọn 1. Khởi động máy chủ rails với RUBYOPT='-W:no-deprecated' rails s

Tùy chọn 2. Đặt export RUBYOPT='-W:no-deprecatedtrong hồ sơ bash / zsh của bạn

Tùy chọn 3. Đặt Warning[:deprecated] = falsemã ruby ​​của bạn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.