У меня есть Account
и Page
модели, которые имеют has_many :through
связь с моей Campaigns
моделью.Я пытаюсь создать таблицу соединений, когда создаю новую страницу с помощью обратного вызова create_after
.
У меня также есть ассоциация has_many :through
с моделями Account
и User
.
Текущая ошибка, которую я получаю, Account must exist
.Я пытаюсь захватить account_id
пользователя logged_in
, но мне трудно.
Я включил все свои модели ниже, чтобы вы могли получить представление о происходящем.Пользователь создает учетную запись, получает электронное письмо для активации, затем входит в систему. На этом этапе все созданное присоединяется к учетной записи, а не к пользователю - в этом случае я хочу создать страницу и создать для нее таблицу соединения с учетной записью черезкампании.
account.rb
class Account < ActiveRecord::Base
after_create :set_membership
belongs_to :owner, class_name: 'User'
accepts_nested_attributes_for :owner
has_many :memberships
has_many :users, through: :memberships
has_many :campaigns
has_many :pages, through: :campaigns
# Create Membership
def set_membership
user_id = self.owner_id
Membership.create!(user_id: user_id, account_id: id)
end
end
user.rb
class User < ApplicationRecord
has_many :memberships
has_many :accounts, through: :memberships
#accepts_nested_attributes_for :accounts
attr_accessor :remember_token, :activation_token, :reset_token
before_save :downcase_email
before_create :create_activation_digest
before_save {self.email = email.downcase}
validates :name, presence: true, length: {maximum: 50}
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true, length: {maximum: 255},
format: {with: VALID_EMAIL_REGEX},
uniqueness: {case_sensitive: false}
has_secure_password
validates :password, presence: true, length: {minimum: 6}, allow_nil: true
validates :password, presence: true, length: {minimum: 6}
after_create :send_activation_email
# Non-Admin User Roles
enum role: [:standard]
after_initialize :set_default_role, if: :new_record?
def set_default_role
self.role ||= :standard
end
# Returns the hash digest of the given string.
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
# Returns a random token.
def User.new_token
SecureRandom.urlsafe_base64
end
# Remembers a user in the database for use in persistent sessions.
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
# Returns true if the given token matches the digest.
def authenticated?(attribute, token)
digest = send("#{attribute}_digest")
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end
# Forgets a user.
def forget
update_attribute(:remember_digest, nil)
end
# Activates an account.
def activate
# update_columns(activated: FILL_IN, activated_at: FILL_IN)
update_attribute(:activated, true)
update_attribute(:activated_at, Time.zone.now)
end
# Sends activation email.
def send_activation_email
UserMailer.account_activation(self).deliver_now
end
# Sets the password reset attributes.
def create_reset_digest
self.reset_token = User.new_token
update_attribute(:reset_digest, User.digest(reset_token))
update_attribute(:reset_sent_at, Time.zone.now)
# update_columns(reset_digest: FILL_IN, reset_sent_at: FILL_IN)
end
# Sends password reset email.
def send_password_reset_email
UserMailer.password_reset(self).deliver_now
end
# Returns true if a password reset has expired.
def password_reset_expired?
reset_sent_at < 2.hours.ago
end
private
# Converts email to all lower-case.
def downcase_email
self.email = email.downcase
end
# Creates and assigns the activation token and digest.
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end
end
page.rb
class Page < ApplicationRecord
after_create :set_campaign
belongs_to :account
has_many :campaigns
has_many :accounts, through: :campaigns
# Create Campaign
def set_campaign
Campaign.create!(account_id: account_id, page_id: id)
end
end
campaign.rb
class Campaign < ApplicationRecord
belongs_to :account
belongs_to :page
end