Create with has_many через ассоциацию получает NoMethodError (undefined метод `name 'для nil: NilClass)

Я делаю этот учебник и застрял в части Tagging. В основном у меня есть статьи, которые могут иметь список тегов. Поскольку одна статья может иметь несколько тегов и наоборот, существует дополнительная модель taggings, с помощью которой эта ассоциация моделируется. Вот модели:

class Article < ActiveRecord::Base
    has_many :comments
    has_many :taggings
    has_many :tags, through: :taggings
end

class Tag < ActiveRecord::Base
    has_many :taggings
    has_many :articles, through: :taggings
end

class Tagging < ActiveRecord::Base
    belongs_to :tag
    belongs_to :article
end

и миграции:

def change
    create_table :articles do |t|
        t.string :title
        t.text :body
        t.timestamps
    end

    create_table :tags do |t|
        t.string :name
        t.timestamps
    end

    create_table :taggings do |t|
        t.references :tag, index: true
        t.references :article, index: true
        t.timestamps
    end

Также существует article_controller с (среди прочих):

def create
    @article = Article.new(article_params)
    @article.save

    redirect_to article_path(@article)
end

Теперь, когда учебник предлагает, когда я пытаюсь создать новый tag с помощью консоли rails для статьи, я получаю NoMethodError для nil:NilClass:

head :011 > Article.first.tags.create(name: "tag")
  Article Load (0.5ms)  SELECT "articles".* FROM "articles" ORDER BY "articles"."id" ASC LIMIT 1
  (0.2ms)  begin transaction
  SQL (0.8ms)  INSERT INTO "tags" ("created_at", "name", "updated_at") VALUES (?, ?, ?)  [["created_at", ...], ["name", "tag"], ["updated_at", ...]]
  SQL (2.1ms)  INSERT INTO "taggings" ("article_id", "created_at", "tag_id", "updated_at") VALUES (?, ?, ?, ?)  [["article_id", 1], ["created_at", ...], ["tag_id", 7], ["updated_at", ...]]
 (0.6ms)  rollback transaction
NoMethodError: undefined method `name' for nil:NilClass

Мне кажется, как будто создается запись tag, а также правильная запись taggings, но, по-видимому, в какой-то момент она пытается найти правильный tag, следовательно, ошибку. Я прав? Как я могу это исправить?

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

UPDATE:

reloading или перезапуск консоли рельсов не имеет эффекта.

Вот обратная трассировка ошибки, с пути как ~/.rvm/gems/ruby-head/gems/activerecord-4.0.4/lib/active_record:

from path/associations/has_many_association.rb:81:in `cached_counter_attribute_name'
from path/associations/has_many_association.rb:77:in `has_cached_counter?'
from path/associations/has_many_association.rb:85:in `update_counter'
from path/associations/has_many_through_association.rb:66:in `insert_record'
from path/associations/collection_association.rb:463:in `block (2 levels) in create_record'
from path/associations/collection_association.rb:367:in `add_to_target'
from path/associations/collection_association.rb:461:in `block in create_record'
from path/associations/collection_association.rb:152:in `block in transaction'
from path/connection_adapters/abstract/database_statements.rb:213:in `block in transaction'
from path/connection_adapters/abstract/database_statements.rb:221:in `within_new_transaction'
from path/connection_adapters/abstract/database_statements.rb:213:in `transaction'
from path/transactions.rb:209:in `transaction'
from path/associations/collection_association.rb:151:in `transaction'
from path/associations/collection_association.rb:460:in `create_record'
from path/associations/collection_association.rb:121:in `create'
from path/associations/collection_proxy.rb:260:in `create'
from (irb):14
from ~/.rvm/gems/ruby-head/gems/railties-4.0.4/lib/rails/commands/console.rb:90:in `start'
from ~/.rvm/gems/ruby-head/gems/railties-4.0.4/lib/rails/commands/console.rb:9:in `start'
from /.rvm/gems/ruby-head/gems/railties-4.0.4/lib/rails/commands.rb:62:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

Ответы

Ответ 1

Я заработал, переключив рубиновые версии. Я использовал ruby-head, который ruby 2.2.0dev. Переключившись на ruby-2.1.1, теперь он работает без ошибок. Должно быть, возможно, это было раньше...

Возможно, это может помочь другим людям, сталкивающимся с подобными ошибками.

Ответ 2

Обновление до Rails 4.0.13 (или более поздней версии) или понижение до Ruby 2.1.1 решает проблему.

Ответ 3

FYI, я могу подтвердить, что это проблема с ActiveRecord и Ruby 2.2. Я использовал ActiveRecord 3.2, и с момента перехода на 3-2-стабильную ветку проблема исчезла. Я считаю, что теперь это исправлено в ветвях 4.x. Я поднял вопрос для этого на https://github.com/rails/rails/issues/18991.

Ответ 4

Я думаю, что есть ошибка в activerecord 4.1.0 с has_cached_counter? и рубин 2.2. Он был зафиксирован на activerecord 4.1.2.

Я получил его для работы, переключив версии рельсов с 4.1.0 до 4.1.2.