我的项目中有一个名为'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
我很害怕我把我的模型叫做应该保留的东西,我该怎么办才能做到最好?重构并更改名称?或其他什么?
更新:我尝试过更新Rakefile的建议,但这不起作用。
答案 0 :(得分:2)
最后,事实证明'任务'已成为很长一段时间的保留词。我使用text mate的find和replace来做一个重构,并创建了迁移来更新数据库。它只花了大约一个小时,我觉得避免将来的问题是值得的。
答案 1 :(得分:2)
我挖得更深,发现了这个:
当我的规格自动加载任务常量时,Rake的const_missing
(source code)启动,发出警告(source code)并返回Rake::Task
。这使我的规格失败,因为我现在正在测试那个而不是我的模型。
然后我得到了很多这些:
NoMethodError:
undefined method `enqueue' for Rake::Task:Class
嗯,当然它没有实现enqueue
- 那不是我的模特!
所以,简而言之,Rake告诉我不要使用他们的顶级Task
(即使我不是故意的),并为我提供了一个不同的常量,有效地打破了Rails中的自动加载!
唯一的方法是 - 我必须在规范中手动require 'task'
。现在它都是小马和彩虹。
亲爱的Jim Weinrich,如果你读到这个:下次你宣布弃用的东西时,请确保你只是在他们实际使用弃用的API时警告这些人!
答案 2 :(得分:1)
另一种处理此问题的方法是摆脱rake的弃用警告。在spec_helper中,在任何引用模型的活动之前,执行以下操作:
# 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。选择你的毒药。