Я делаю этот учебник и застрял в части 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>'