Добавление атрибутов пользователю при отправке приглашения через Devise_Invitable

Я застрял и не уверен, как добавить "account_id" для пользователя, когда его учетная запись создается с помощью devise_invitble (при отправке первоначального приглашения).

Основной рабочий процесс заключается в том, что владелец создает учетную запись, после чего владелец учетной записи может пригласить кого-либо использовать приложение с devise invitable. Мне нужно отследить, что пользователь связан с учетной записью, поскольку учетная запись имеет только "х" количество пользователей в зависимости от типа плана.

class InvitationsController < Devise::InvitationsController

  after_action :update_user_account, :only => [:create]


  def update_user_account
    @user = User.find_by_email(params[:user][:email])
    @user.update_attributes(:account_id => current_account.id )
  end

end

это то, что я использую сейчас, однако, когда я поднимаю этого пользователя в консоли rails и смотрю на него в выводе сервера, account_id пользователей по-прежнему равен нулю.

это модель счета:

class Account < ApplicationRecord
  include ImageUploader[:image]
  # Constants
  RESTRICTED_SUBDOMAINS = %w(www patrolvault admin test type taurenapplabs taurenmaterialservices)

  # Before Actions
  before_validation :downcase_subdomain

  # Relationships
  belongs_to :owner, class_name: 'User', optional: true
  accepts_nested_attributes_for :owner
  has_many :users

  # Validations
  validates :owner, presence: true

  validates :subdomain, presence: true,
                        uniqueness: { case_sensitive: false },
                        format: { with: /\A[\w\-]+\Z/i, message: 'Contains invalid characters.' },
                        exclusion: { in: RESTRICTED_SUBDOMAINS, message: 'Restricted domain name'}

  has_one :plan
  accepts_nested_attributes_for :plan

  private

  def downcase_subdomain
    self.subdomain = self.subdomain.downcase
  end

end

Это модель пользователя:

class User < ApplicationRecord
  # Constants & Enums
  USER_LIMITS = ActiveSupport::HashWithIndifferentAccess.new(
    #Plan Name      #Auth Users
    responder:        6,
    first_responder:  12,
    patrol_pro:       30,
    guardian:         60
  )

  # Before Actions

  # Devise Modules
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :confirmable, :invitable, :lockable, :timeoutable

  # Relationships
  belongs_to :account, optional: true

  # Validations
  validates :f_name, presence: true
  validates :l_name, presence: true
  validates :date_of_birth, presence: true

  #validate :must_be_below_user_limit

  # Custom Methods
  def full_name
    l_name.upcase + ", " + f_name
  end

end

Пожалуйста, любая помощь здесь будет принята с благодарностью!, это действительно мешает мне.

2 ответа

Решение

@user.update_attributes(:account_id => current_account.id ) не удается, потому что проверки в модели пользователя не проходят. Одним из способов решения этой проблемы является обновление пользовательской записи с помощью update_all, который является методом только для SQL и пропускает проверки:

def update_user_account
  User.where(email: params[:user][:email]).update_all(account_id: current_account.id)
end

Или меньше кода:

def create
  super
  User.where(email: params[:user][:email]).update_all(account_id: current_user.account.id)
end
Другие вопросы по тегам