Ruby on rails 对顶级常量的引用已弃用';任务';

Ruby on rails 对顶级常量的引用已弃用';任务';,ruby-on-rails,Ruby On Rails,我的项目中有一个名为“Task”的模型 我从Rails 3.0升级到Rails 3.1,现在收到以下错误。我的密码没有变 >> Task.new WARNING: Deprecated reference to top-level constant 'Task' found at: /Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2470:in `rakefile_location' Use --classic-names

我的项目中有一个名为“Task”的模型

我从Rails 3.0升级到Rails 3.1,现在收到以下错误。我的密码没有变

>> Task.new
WARNING: Deprecated reference to top-level constant 'Task' found at: /Library/Ruby/Gems/1.8/gems/rake-0.8.7/lib/rake.rb:2470:in `rakefile_location'
    Use --classic-namespace on rake command
    or 'require "rake/classic_namespace"' in Rakefile
ArgumentError: wrong number of arguments (0 for 2)
    from (irb):1:in `initialize'
    from (irb):1:in `new'
    from (irb):1
我害怕我把我的模型称为应该保留的东西,我该怎么做才能获得最佳实践?重构并更改名称?还是别的什么


更新:我尝试了it关于更新Rakefile的建议,但没有成功。

最后,发现“任务”已经是一个保留字很久了。我使用text mate的find and replace进行重构,并创建迁移来更新数据库。只花了大约一个小时,我觉得避免未来的问题是值得的。

我深入挖掘了一下,发现了这个问题:

当我的规范自动加载任务常量时,Rake的
const_missing
()将启动,发出警告()并返回
Rake::Task
。这使得我的规格失败,因为我现在测试的是它,而不是我的模型

然后我得到了很多这样的信息:

NoMethodError:
  undefined method `enqueue' for Rake::Task:Class
当然,它没有实现排队,这不是我的模型

因此,简言之,Rake告诉我不要使用他们的顶级
任务
(尽管我不是有意的),并为我提供了一个不同的常量,有效地打破了Rails中的自动加载

这是唯一的解决办法——我必须手动
在规范中要求“任务”
。现在所有的都是小马和彩虹


亲爱的Jim Weinrich,如果您阅读了以下内容:下次您声明某个已弃用的API时,请确保您仅在人们实际使用已弃用的API时警告他们

另一种处理方法是去掉rake的弃用警告。在spec_助手中,在任何引用模型的活动之前,请执行以下操作:

# Rake defines a const_missing that, if you reference any of several
# top-level constants, issues a deprecation warning and then defines
# it.  Since Rake defines it, rail's own const_missing doesn't
# happen, and our own class doesn't get loaded.  The workaround is to
# remove rake's const_missing.

class Module
  def const_missing(*args)
    rake_original_const_missing(*args)
  end
end

我们本可以重新命名我们的模型,但这需要做更多的工作。然而,这可能会与rake的未来版本相冲突。选择你的毒药。

ahhhh我刚刚遇到同样的问题,我将不得不重命名我的模型。下次我一定会查看这个列表:到目前为止,我们已经在许多应用程序中使用了一个任务模型,没有任何问题。突然,我在一个应用程序中遇到了这个问题:(-我在另一个答案中分享了我的发现。