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

Posted

技术标签:

【中文标题】如何使用 Ruby 2.7.0 修复 Rails 的警告消息【英文标题】:How to fix Rails's warning messages with Ruby 2.7.0 【发布时间】:2020-04-16 21:33:53 【问题描述】:

有人用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

服务器已启动,网站已提供服务,但在 Console 日志中我看到两条警告消息:

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**

【问题讨论】:

位置参数和关键字参数在 Ruby 3.0 中是分开的。这只是一个警告。 Rails 充满了这种模式。 ruby-lang.org/en/news/2019/12/12/… @JoshBrody 非常感谢你。我看到了这个链接,并且有一些关于切换警告的建议,例如“如果您想禁用弃用警告,请使用命令行参数 -W:no-deprecated 或在您的代码中添加 Warning[:deprecated] = false。 "但我正在考虑为 actionpack v6.0.2.1 提供更好的解决方案/修复 全面隐藏弃用警告是个坏主意,尤其是当您想顺利进行未来的升级时。 @Vlad 同意,但暂时减少日志噪音是可以的(如果你知道自己在做什么) 【参考方案1】:

抑制警告,例如:

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

现在,只需将 RUBYOPT 环境变量前缀/传递给您的 rails 命令:

RUBYOPT='-W:no-deprecated -W:no-experimental' rails serverRUBYOPT='-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-

【讨论】:

其中一个问题是安装了 -W:no-deprecated' 标志无效的早期版本的 Ruby 会引发错误。我通过使用 export RUBYOPT='-W0' 解决了这个问题 有没有一种方法可以调用不会发出警告的任务,即以不被弃用的方式调用它? @barlop 好吧,发出警告的不是任务。警告来自底层代码。如果它们在您自己的代码中,基本上找到弃用并修复它们就可以了。如果它们不是您的代码的一部分,则在您包含的 gem 的 repos 上打开问题或拉取请求,并要求他们进行修复。或者只是等待他们修复它。这里提到了一些弃用:ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released 和这里:rubyreferences.github.io/rubychanges/2.7.html @KhalilGharbaoui 谢谢。我刚刚做了。一个新的 ruby​​ 和 rails iirc pastebin.com/SYjypsrP 的insall 看起来我每个都有最新的,我所做的只是创建了一个空白项目,尝试了 rake 帮助并得到了 rails db:migrate 的警告。我想我应该继续那些回购。耙关于提及动作包。 rake db:migrate 或 rails db:migrate 提到 actionpack、activerecord、activemodel。虽然其中一些甚至不是 Rails 原生的,但并没有那么奇怪,以至于 Rails 的人们无法正确理解。 您不应该禁止显示警告,只需更新到最新的 Rails 版本即可。【参考方案2】:

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

如果您仍然收到警告,则可能是其他库(查看是否有固定版本或提交补丁)或您自己的代码 (how to fix it)。

【讨论】:

如何在 Rails 5 中解决这个问题?最新的 Rails 5 版本仍然有警告。 @morgler 正如Rails maintenance policy 中所述,目前只有 Rails 6.1 会收到错误修复。您要么更新到 Rails 6.0.3 或更高版本,要么自己分叉并修复警告,要么找到现有的分叉,要么接受警告,要么按照其他答案的建议隐藏它们。 我在Rails 6.0.3.2收到警告 @stevec 很可能是您自己的代码或其他库导致了警告。 Rails 已修复 我正在使用 rails 6.0.3.6,仍然收到警告为 '/Users/***/.rvm/gems/ruby-2.7.2/gems/json-1.8.6/lib/ json/common.rb:155:警告:不推荐使用最后一个参数作为关键字参数'【参考方案3】:

显然,ruby 团队需要一些时间才能在下一个 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* 模块和红宝石。

我们可能需要一些时间来升级代码和 gem 以获得最新的东西。

【讨论】:

以上是关于如何使用 Ruby 2.7.0 修复 Rails 的警告消息的主要内容,如果未能解决你的问题,请参考以下文章

如何修复错误:Ruby on Rails 中的“Sass::SyntaxError in Posts#index”?

在 Windows 7 x64 上安装 Ruby、Rails 和 DevKit 的问题 - 需要修复

如何在 order rails 查询中修复 sql 注入

ruby 猴子补丁修复身份验证失败! invalid_credentials:OAuth2 ::错误jruby 8,rails 3.2.13 devise 3.2.4 |迫使法拉第'uncom

ruby/rails:如何确定是不是包含模块?

如何在一个简单的非 Rails 项目中使用特定的 Ruby 版本