我在Ruby 1.8.7-p174上运行Rails 3.0.0应用程序。一切都在游泳,直到我试图进行一些测试:
/Users/avand/.rvm/gems/ruby-1.8.7-p174/gems/activesupport-3.0.0/lib/active_support/core_ext/date/calculations.rb:9: undefined method `>>' for class `Date' (NameError)
from /Users/avand/.rvm/gems/ruby-1.8.7-p174/gems/activesupport-3.0.0/lib/active_support/ruby/shim.rb:12:in `require'
from /Users/avand/.rvm/gems/ruby-1.8.7-p174/gems/activesupport-3.0.0/lib/active_support/ruby/shim.rb:12
from /Users/avand/.rvm/gems/ruby-1.8.7-p174/gems/actionpack-3.0.0/lib/abstract_controller.rb:6:in `require'
from /Users/avand/.rvm/gems/ruby-1.8.7-p174/gems/actionpack-3.0.0/lib/abstract_controller.rb:6
我看了一下Calculations类,注意到undef
正在调用:>>
。但Ruby 1.8.7 Date
没有>>
方法。我想我会用一个条件包裹它:if respond_to?(:>>)
。事情进展得很厉害:
/Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0/lib/active_support/core_ext/date/calculations.rb:91:in `alias_method': undefined method `+' for class `Date' (NameError)
from /Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0/lib/active_support/core_ext/date/calculations.rb:91:in `<class:Date>'
from /Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0/lib/active_support/core_ext/date/calculations.rb:7:in `<top (required)>'
from /Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0/lib/active_support/ruby/shim.rb:12:in `require'
from /Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/activesupport-3.0.0/lib/active_support/ruby/shim.rb:12:in `<top (required)>'
from /Users/avand/.rvm/gems/ruby-1.9.2-rc2/gems/actionpack-3.0.0/lib/abstract_controller.rb:6:in `require'
第二个堆栈跟踪是Ruby 1.9.2。我在Ruby 1.9.2中得到了同样的错误,而我的respond_to?
检查没有用它作为Ruby 1.8.7。
我在lib中注释了我的Date
扩展名。这只发生在测试环境中。
思想?
答案 0 :(得分:1)
所以这可能不是最有帮助的答案,但这是我迄今为止所能确定的。
有问题的文件:activesupport-3.0.0 / lib / active_support / core_ext / date / computation.rb删除以下定义:&gt;&gt;如你所见。如果文件需要两次,则由于不再在Date类上定义该方法,该文件的第二次加载将失败。
那么为什么这个文件需要两次呢?我真的不确定。我已经看到,当你用一个完整的路径指定文件然后另一次你依赖于LOAD_PATH时,防止这种情况可能是错误的(如果你把它称为一个错误,它可能只是一个限制)正确的文件夹,以找到你那样的文件。
我会查看你的代码,看看有什么需要rails / all或activesupprt / railstie,希望你会看到两个看起来略有不同的地方。另外,看看你是否在两地之间的任何地方乱搞LOAD_PATH。