Ошибка отслеживаемого объекта при создании с PublicActivity
У меня есть класс FamilyTree
что я отслеживаю с PublicActivity.
Ассоциации следующие:
пользователь
has_one :family_tree, dependent: :destroy
has_many :memberships, dependent: :destroy
has_many :nodes, dependent: :destroy
Узел
include PublicActivity::Model
tracked except: :update, owner: ->(controller, model) { controller && controller.current_user }
tracked except: :update, recipient: ->(controller, model) { model && model.user }
belongs_to :family_tree
belongs_to :user
Семейное дерево
include PublicActivity::Model
tracked owner: ->(controller, model) { controller && controller.current_user }
tracked recipient: ->(controller, model) { model && model.node.user }
belongs_to :user
has_many :memberships, dependent: :destroy
has_many :members, through: :memberships, source: :user, dependent: :destroy
has_many :nodes, dependent: :destroy
Моя схема FamilyTree выглядит следующим образом:
# == Schema Information
#
# Table name: family_trees
#
# id :integer not null, primary key
# name :string(255)
# user_id :integer
# created_at :datetime
# updated_at :datetime
И моя схема узла выглядит так:
# == Schema Information
#
# Table name: nodes
#
# id :integer not null, primary key
# name :string(255)
# family_tree_id :integer
# user_id :integer
# media_id :integer
# media_type :string(255)
# created_at :datetime
# updated_at :datetime
# circa :datetime
# is_comment :boolean
Пользователь нормальный материал (электронная почта и т. Д.)
Вопрос, который я имею, находится на моем User
класс, у меня есть after_create :create_family_tree
это выглядит так:
def create_family_tree
family_tree = self.build_family_tree(name: "#{name}'s Family Tree")
family_tree.save!
end
Но когда я создаю новую учетную запись пользователя (т.е. я регистрируюсь как новый пользователь), я получаю следующую ошибку:
NoMethodError at /users
undefined method `node' for #<FamilyTree:0x007fcd3d3a9668>
Эта ошибка происходит в этой строке в моем FamilyTree.rb
модель:
tracked recipient: ->(controller, model) { model && model.node.user }
Вот журналы операции:
Started POST "/users" for 127.0.0.1 at 2015-02-24 19:35:13 -0500
Processing by RegistrationsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"E0pKO/ftHXNNUlM=", "user"=>{"name"=>" Def Jam", "email"=>"def@test.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create My App Account"}
Unpermitted parameters: name
(1.1ms) BEGIN
User Exists (3.3ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = 'def@test.com' LIMIT 1
User Load (3.9ms) SELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'asdadasdsac4ff' ORDER BY "users"."id" ASC LIMIT 1
SQL (3.8ms) INSERT INTO "users" ("confirmation_sent_at", "confirmation_token", "created_at", "email", "encrypted_password", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id" [["confirmation_sent_at", "2015-02-25 00:35:13.948623"], ["confirmation_token", "fdeb4f33c954f5ddae3c4ff"], ["created_at", "2015-02-25 00:35:13.942009"], ["email", "def@test.com"], ["encrypted_password", "$2a$10$t1aPhkOwS"], ["updated_at", "2015-02-25 00:35:13.942009"]]
Rendered devise/mailer/confirmation_instructions.html.erb within layouts/mail (0.9ms)
DeviseMailer#confirmation_instructions: processed outbound mail in 54.2ms
Sent mail to def@test.com (49.5ms)
Date: Tue, 24 Feb 2015 19:35:14 -0500
From: support@myapp.com
Reply-To: support@myapp.com
To: def@test.com
Message-ID: <54ed18c24@myapp.local.mail>
Subject: My App App: Confirmation Instructions
</body>
</html>
FamilyTree Load (2.9ms) SELECT "family_trees".* FROM "family_trees" WHERE "family_trees"."user_id" = $1 LIMIT 1 [["user_id", 10]]
SQL (3.3ms) INSERT INTO "family_trees" ("created_at", "name", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", "2015-02-25 00:35:14.143397"], ["name", " 's Family Tree"], ["updated_at", "2015-02-25 00:35:14.143397"], ["user_id", 10]]
(1.9ms) ROLLBACK
Completed 500 Internal Server Error in 324ms
Я думал, что одним из возможных решений могло быть создание root_node
для права family_tree, так как было создано family_tree (иначе after_create
на семейном_дереве). Проблема заключается в том, что запрос никогда не поступает туда, потому что эта ошибка происходит до того, как семейное_дерево может быть успешно создано.
Я не совсем уверен, как поступить.
Какие-нибудь мысли?
1 ответ
Это потому что ты звонишь build_family_tree
до того, как объект был создан. Попробуйте использовать after_commit
вместо.
after_commit :create_family_tree, on: :create