Ruby on rails 对顶级常量的引用已弃用';任务';
我的项目中有一个名为“Task”的模型 我从Rails 3.0升级到Rails 3.1,现在收到以下错误。我的密码没有变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.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我刚刚遇到同样的问题,我将不得不重命名我的模型。下次我一定会查看这个列表:到目前为止,我们已经在许多应用程序中使用了一个任务模型,没有任何问题。突然,我在一个应用程序中遇到了这个问题:(-我在另一个答案中分享了我的发现。