Обновление приложения Rails 2.3.8 до Rails 3.0.1, не может вызывать create на любых моделях - PullRequest
0 голосов
/ 02 ноября 2010

Я пытаюсь обновиться с 2.3.8 до 3.0.1, но эта проблема мучает меня и мешает дальнейшему прогрессу в течение достаточно долгого времени. Любая попытка создать что-либо из моих моделей (например, вызов Subject.create! Из консоли) всегда приводит к этой ошибке:

NoMethodError: undefined method `name' for 0:Fixnum
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/engines/sql/engine.rb:26:in `block in create'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/engines/sql/engine.rb:26:in `each'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/engines/sql/engine.rb:26:in `detect'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/engines/sql/engine.rb:26:in `create'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/algebra/relations/writes.rb:24:in `call'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/session.rb:17:in `create'
from /.rvm/gems/ruby-1.9.2-p0/gems/arel-1.0.1/lib/arel/algebra/relations/relation.rb:159:in `insert'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/relation.rb:14:in `insert'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/persistence.rb:271:in `create'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/timestamp.rb:47:in `create'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/callbacks.rb:281:in `block in create'
from /.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/callbacks.rb:413:in `_run_create_callbacks'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/callbacks.rb:281:in `create'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/persistence.rb:247:in `create_or_update'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/callbacks.rb:277:in `block in create_or_update'
from /.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.1/lib/active_support/callbacks.rb:413:in `_run_save_callbacks'
... 1 levels...
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/persistence.rb:56:in `save!'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/validations.rb:49:in `save!'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/attribute_methods/dirty.rb:30:in `save!'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/transactions.rb:242:in `block in save!'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/transactions.rb:204:in `transaction'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/transactions.rb:287:in `with_transaction_returning_status'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/transactions.rb:242:in `save!'
from /.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.1/lib/active_record/validations.rb:34:in `create!'
from (irb):1
from /.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:44:in `start'
from /.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands/console.rb:8:in `start'
from /.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.1/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'ruby-1.9.2-p0

Может показаться, что у Арела нет должного отношения к работе, но я заблудился относительно причины этого. Есть идеи?

Спасибо!

Ryan

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Какую версию Ruby вы используете? Это должно быть либо 1.8.7, либо 1.9.2. У меня были подобные необъяснимые проблемы с 1.9.1.

0 голосов
/ 02 ноября 2010

Я бы порекомендовал поместить несколько отладочных операторов в arel. Отредактируйте engine.rb в последней строке трассировки стека. Я думаю, вам придется перезапустить консоль (а не просто перезагрузить!), Чтобы увидеть изменения в файле arel.

Вот неправильная строка в engine.rb:

attribute = relation.record.detect { |attr, _| attr.name.to_s == relation.primary_key.to_s }

Возможно, попробуйте распечатать имена атрибутов и посмотреть, проходит ли что-нибудь через метод обнаружения массива. Или распечатайте класс "attr". Класс должен быть "Arel :: Attribute", но очевидно, что Fixnum каким-то образом проходит туда.

attribute = relation.record.detect do |attr, _|
   p attr.class
   p attr.name
   attr.name.to_s == relation.primary_key.to_s
end

Просто предположение, но я думаю, что плагин / драгоценный камень мешает чему-то в ваших моделях. Используете ли вы какие-либо зависимости, которые напрямую связаны с ActiveRecord?

Еще одним хорошим упражнением было бы создание пустого приложения на Rails 3 (без гемов или зависимостей от плагинов) с одной моделью и проверка, нет ли таких ошибок. Это исключило бы что-то в вашей среде разработки. Затем, если это сработает, возможно, вы сможете начать удалять некоторые зависимости по одной из другого приложения и посмотреть, не вызывает ли одна из них ошибку.

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