Создать запись для другой модели при создании аккаунта? - PullRequest
0 голосов
/ 14 февраля 2020

У меня мультитенантное приложение. Когда учетная запись создается, учетная запись принадлежит владельцу, а также создает запись пользователя для владельца. Этот владелец может приглашать других пользователей через таблицу вступления в членство. Все пользователи, кроме владельцев аккаунтов, имеют членство в аккаунте.

Для пользователей с членством (не владельцев учетных записей) отображается страница учетной записи / users /: id show. Я хочу то же самое для владельцев учетных записей, но получаю следующее сообщение об ошибке:

ActiveRecord::RecordNotFound in Accounts::UsersController#show
Couldn't find User with 'id'=2 [WHERE "memberships"."account_id" = $1]

def show
  @user = current_account.users.find(params[:id])
end

Я могу добавить членство к владельцу пользователя в панели администратора, и эта ошибка исчезнет, ​​однако я бы хотел добавьте членство владельцу / пользователю, когда они создают свою учетную запись.

Есть идеи?

Добавление @account.memberships.build(user_id: current_user, account_id: current_account) перед if @account.save в контроллере учетных записей ниже не работает.

контроллеры

user.rb

module Accounts
  class UsersController < Accounts::BaseController
    before_action :authorize_owner!, only: [:edit, :show, :update, :destroy]

    def show
      @user = current_account.users.find(params[:id])
    end

    def destroy
      user = User.find(params[:id])
      current_account.users.delete(user)
      flash[:notice] = "#{user.email} has been removed from this account."
      redirect_to users_path
    end
  end
end

accounts_controller.rb

class AccountsController < ApplicationController
  def new
    @account = Account.new
    @account.build_owner
  end

  def create
    @account = Account.new(account_params)
    if @account.save
      sign_in(@account.owner)
      flash[:notice] = "Your account has been created."
      redirect_to root_url(subdomain: @account.subdomain)
    else
      flash.now[:alert] = "Sorry, your account could not be created."
      render :new
    end
  end

  private

    def account_params
      params.require(:account).permit(:name, :subdomain,
        { owner_attributes: [:email, :password, :password_confirmation
        ]}
      )
    end
end

Модели

user.rb

class User < ApplicationRecord
  has_many :memberships
  has_many :accounts, through: :memberships

  def owned_accounts
    Account.where(owner: self)
  end

  def all_accounts
    owned_accounts + accounts
  end
end

account.rb

class Account < ApplicationRecord
  belongs_to :owner, class_name: "User"
  accepts_nested_attributes_for :owner

  validates :subdomain, presence: true, uniqueness: true

  has_many :memberships
  has_many :users, through: :memberships
end

members.rb

class Membership < ApplicationRecord
  belongs_to :account
  belongs_to :user
end

Ответы [ 2 ]

0 голосов
/ 15 февраля 2020

Закончилось ответом на этот вопрос, поставив эту строку под if @account.save:

if @account.save
  @account.memberships.create(user_id: @account.owner.id, account_id: @account.id)

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

0 голосов
/ 15 февраля 2020

Вы пробовали перезвонить after_create? Если это сработает, вам нужно будет вычислить это на клиенте, а администратор создаст учетную запись, самостоятельно назначая (администратор) против создания при назначении (клиент).

# models/account.rb
  after_create do
    self.memberships.create(user_id: self.owner, account_id: self.id)
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...