在Rails 5中的弃用警告

7

每次我执行测试时,都会收到这些弃用警告:

DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/johnvanarkelen/Documents/Web development/rails/test-eagle/config/environment.rb:5)
DEPRECATION WARNING: alias_method_chain is deprecated. Please, use Module#prepend instead. From module, you can access the original method using super. (called from <top (required)> at /Users/johnvanarkelen/Documents/Web development/rails/test-eagle/config/environment.rb:5)
DEPRECATION WARNING: after_filter is deprecated and will be removed in Rails 5.1. Use after_action instead. (called from <top (required)> at /Users/johnvanarkelen/Documents/Web development/rails/test-eagle/config/environment.rb:5)

当我检查config/environment.rb的第5行时,有这段代码:
Rails.application.initialize!

当我在我的代码库中搜索 after_actionafter_filteralias_method_chain 时,找不到它们。我该怎么做才能消除这些警告?

1
它可能被用在一个 gem 内部,查看你所有的 gems,看看是否有任何一个正在使用它。 - Doon
+1 Doon,你最近是否执行了“bundle update”以确保你拥有最新的gems。目前许多gems尚未正式支持Rails 5。 - ilan berci
在升级到Rails 5之后,所有的gem都已经更新了。你如何检测它来自哪个gem? - John
你可以在你的宝石库中进行 Grep 搜索。 - ilan berci
你也可以安全地忽略它,随着你的 gem 依赖增加,想要保持警告列表清晰几乎是不可能的。 - ilan berci
忽略这些警告 不是 一个好主意。我曾经开发过一些应用,这些应用从 Rails 2 迁移到 5,没有任何警告信息。 - Nick Tomlin
2个回答

4

为什么

在最近的Rails 5升级中,我遇到了alias_method_chain已过时......来自/path/to/your/environment.rb的<top (required)>。这通常指向在Rails应用程序的initialize!调用期间需要的gem或者如果您手动引用依赖项(正如我所做的那样)则为Bundler.require

它可能更好地表达为:

你所依赖的随机Gem在Rails初始化时做了我不喜欢的事情。找到它吧!

如何修复它(也许)

以下是我遵循的松散步骤以解决这些未知错误:

  1. 找到您的gem路径
    • 您通常可以使用bundle show rails$GEM_PATH的父目录来确定当前存储您捆绑包中的gems的位置(请注意,对于来自不同来源的gems,例如git依赖项与从rubygems获取的依赖项存储方式不同)
  2. 使用您喜欢的文本搜索工具(grepripgrip ag)搜索过时的方法名称,例如rg "alias_method_chain" <gem path>
  3. 升级或删除该gem,以查看是否消除了过时警告
  4. 希望它会消失!

在我的情况下,alias_method_chain的过时警告是在Kaminari的过时版本中。我更新了Gemfile以允许使用更近期的版本,然后运行bundle update kaminari来解决问题。

旁注

忽略这些警告是一个非常糟糕的主意;如果它们没有立即影响,很容易让这些小事情滑入应用程序中。这导致忽略警告或错误的行为正常化;这意味着您的应用程序中存在更多的错误和不一致性,并且当您尝试升级到删除过时行为的Rails版本时,保证会遇到麻烦。如果您或您的团队建立了立即查找和修复这些错误的标准,则很容易在出现实际问题时发现并解决它们。您未来的自己会感谢您 :)


0

我最近遇到了同样的错误。在创建一个新的Rails 5应用程序大约2分钟后,我就收到了这个错误。当我刚刚开始chartkick教程时,我就遇到了同样的错误。

操作顺序

  1. rails g model Visit country:string visited_at:datetime load_time:decimal
  2. rake db:migrate
  3. BOOM!收到相同的错误,它不允许我继续制作我的模式。

错误信息DEPRECATION WARNING:alias_method_chain已弃用。请改用Module#prepend。从模块中,您可以使用super访问原始方法。(在richOnRails/chartkick/config/application.rb的顶部(需要)调用) rake aborted!

错误消息提到config/application.rb的第7行出现问题,如下所示:

require_relative 'boot'
require 'rails/all'

**Bundler.require(*Rails.groups)**
module Chartkick
    class Application < Rails::Application
    end
end

第7行:Bundler.require(*Rails.groups) *星号用于区分第7行。

我没有看到第7行有任何真正的问题。


尝试使用以下命令解决问题:

  • bundle exec rake db:migrate [得到相同的错误]

  • bundle update

最终,通过以下代码解决了部分导致错误的问题:

bin/rake db:create

rake db:migrate

我仍然收到相同的错误消息,但现在我能够使用和访问我的数据库。显然错误仍然存在,但不再妨碍我的进展。我还应该注意到,我的新Rails应用程序是使用PostgreSQL作为默认数据库构建的。

rails new chartkick --database=postgresql

不确定这对你有帮助,但它可能会帮助其他人调试此问题。


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