如何使用Ruby 2.7.0修复Rails的警告信息

66

有人解决过 Ruby 2.7.0 的这个问题吗?

我使用了 rbenv 安装了 Ruby v2.7.0,然后使用 Rails v6.0.2.1 创建了一个 Rails 项目。

目前,通过运行以下命令之一:

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

服务器已开启并提供了网站服务,但在控制台日志中我看到两条警告信息:

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 
所以,警告信息为:
**.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**

我看到了 这个链接,其中提出了一些建议,例如关闭警告,如“如果您想禁用弃用警告,请使用命令行参数-W:no-deprecated或将Warning [:deprecated] = false添加到您的代码中。” 不过,我正在考虑一个更好的解决方案/修复方法,适用于actionpack v6.0.2.1。


9
在Ruby 3.0中,必须将位置参数和关键字参数分开。这只是一个警告。Rails中充满了这种模式。https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0/ - Josh Brody
4
@JoshBrody非常感谢。我看到了这个链接,里面提出了一些建议来关闭警告,比如“如果您想禁用弃用警告,请使用命令行参数-W:no-deprecated或在代码中添加Warning[:deprecated] = false。”但我在思考一种更好的解决方案/修复方法,适用于actionpack v6.0.2.1。 - Nezir
1
在整个项目中隐藏弃用警告是一个坏主意,特别是当您想要平稳升级时。 - Vlad
2
@Vlad同意,但是暂时减少日志噪音是可以的(如果你知道你在做什么)。 - Khalil Gharbaoui
3个回答

80

为了消除类似以下的警告:

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

目前,只需在rails命令之前加上/传递RUBYOPT环境变量即可:

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

这可能不适用于早期版本的ruby。

为了向后兼容早期版本的ruby,请在其前面加上RUBYOPT='-W0'

例如:

RUBYOPT='-W0' bundle exec rspec

如果您不想每次运行命令时都添加前缀,则只需将此代码添加到您的.zshrc.bashrc文件的最后一行(无论您使用哪个):

export RUBYOPT='-W:no-deprecated -W:no-experimental'
或者
export RUBYOPT='-W0'

还可以参见此处注释的最后一点:
https://rubyreferences.github.io/rubychanges/2.7.html#warning-and-


2
其中一个问题是,安装了之前版本的 Ruby,其中“-W:no-deprecated”标志无效会抛出错误。我通过使用“export RUBYOPT ='-W0'”来解决这个问题。 - Augusto Samamé Barrientos
有没有一种方式可以调用任务而不会产生警告,即以不被弃用的方式调用它呢? - barlop
@barlop 嗯,不是任务导致警告。警告来自底层代码。 基本上,如果在您自己的代码中找到了弃用项并进行修复,则可以解决这些警告。 如果它们不是您的代码的一部分,则在包含的 gem 存储库上打开问题或拉取请求,并要求他们进行修复。或者等待他们修复它。这里提到了一些弃用项: https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/ 和这里: https://rubyreferences.github.io/rubychanges/2.7.html - Khalil Gharbaoui
@KhalilGharbaoui 谢谢。我刚刚重新安装了Ruby和Rails,如果我没记错的话,https://pastebin.com/SYjypsrP 看起来我已经拥有了最新的版本,并且我只是创建了一个空项目,尝试了rake help并得到了警告,还有rails db:migrate。我想我应该去那些仓库看看。rake about提到了actionpack。rake db:migrate或rails db:migrate提到了actionpack、activerecord、activemodel。虽然其中一些甚至是Rails本身的组成部分,所以奇怪的是Rails开发人员不能搞定它。 - barlop
你不应该忽略这些警告,而是应该升级到最新的Rails版本。 - iGEL

14

更新到Rails 6.0.3版本,他们修复了警告。

如果你仍然收到警告,则可能是其他库的问题(查看是否有修复的版本或提交一个补丁),或者是你自己的代码(如何修复)。


在Rails 5中,我该如何解决这个问题?最新的Rails 5版本仍然有警告。 - morgler
1
Rails维护政策所述,目前只有Rails 6.1将接收错误修复。您可以升级到Rails 6.0.3或更高版本,自行分叉并修复警告,或查找现有的分叉,或者像其他答案建议的那样隐藏它们。 - iGEL
我在 Rails 6.0.3.2 上收到了警告。 - stevec
1
@stevec 很可能是你自己的代码或其他库引起了这些警告。Rails已经修复了。 - iGEL
我正在使用Rails 6.0.3.6版本,但仍然收到警告:“/Users/***/.rvm/gems/ruby-2.7.2/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated”。 - honey
@devsat 请阅读前面的评论。 - iGEL

6
显然,Ruby团队需要一些时间才能在下一个版本中删除所有这些警告。现在,在您的终端中使用以下命令。
`RUBYOPT='-W:no-deprecated' rails s` 

在我的基础、简单的新Rails 6.0.2.1和Ruby 2.7.0项目中,删除上述问题中的这两行警告信息。

另外,使用以下命令:

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

你可以隐藏有关实验功能的警告。
你可以将这两个命令结合成一个,例如:
RUBYOPT='-W:no-deprecated -W:no-experimental' rails s

然而,我在我的旧项目中尝试了这些命令,该项目是使用rails 5.2和ruby 2.6.4构建的,后来升级到了rails 6.0.1。但是,由于来自不同的rails Active*模块和ruby gem的警告消息,这些命令并没有很好地工作。

可能我们需要一些时间来升级代码和gem以适应新的最新技术。


在Rails 6.1和Ruby 2.7.2中似乎没有任何效果。我仍然看到警告:.rvm/gems/ruby-2.7.2/gems/json-1.8.6/lib/json/common.rb:155: warning: Using the last argument as keyword parameters is deprecated - mansoor.khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接