Неопределенный метод '>>' для класса 'Date' в Rails 3 на Ruby 1.8.7 / 1.9.2 - PullRequest
0 голосов
/ 06 сентября 2010

Я использую приложение Rails 3.0.0 на Ruby 1.8.7-p174. Все шло гладко, пока я не попытался запустить несколько тестов:

/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

Я заглянул в этот класс вычислений, отметив, что undef вызывается с :>>. Но в Ruby 1.8.7 Date s нет метода >>. Я решил, что оберну это с условием: 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 с ним.

Я прокомментировал свои Date расширения в lib. Это происходит только в тестовой среде.

Мысли

1 Ответ

1 голос
/ 06 сентября 2010

Так что, возможно, это не самый полезный ответ, но это все, что я смог определить до сих пор.

Файл, о котором идет речь: activesupport-3.0.0 / lib / active_support / core_ext / date / computing.rb удаляет определения: >> как вы видели. Если файл требуется дважды, вторая загрузка этого файла завершится неудачей из-за того, что метод больше не определяется в классе Date.

Так почему этот файл требуется дважды? В этом я действительно не уверен. Я видел, что защита от этого может быть глючной (если вы назовете это ошибкой, это может быть просто ограничение), когда вы указываете файл с полным путем один раз, а затем в другой раз, когда вы зависите от LOAD_PATH, имеющего правильная папка в нем, чтобы найти файл таким образом.

Я бы посмотрел ваш код и увидел, что требует либо rails / all, либо activesupprt / railstie, и, надеюсь, вы увидите два отдельных места, которые выглядят немного по-разному. Также посмотрите, если вы гадите с LOAD_PATH где-нибудь между двумя местами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...