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

#ruby-on-rails #ruby-on-rails-4 #devise-invitable

#ruby-on-rails #ruby-on-rails-4 #разработка-invitable

Вопрос:

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

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

 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 и просматриваю его в выводе сервера, идентификатор учетной записи пользователя по-прежнему равен нулю.

это модель учетной записи:

 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 amp; 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
  

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

Комментарии:

1. Похоже, что запись пользователя может не сохраняться, потому что проверки не проходят. Вы уверены, что у пользователя есть f_name, l_name и date_of_birth?

2. @infused когда я отправляю приглашение, единственными заполненными полями в консоли являются электронная почта и все приглашаемые поля, когда пользователь принимает приглашение, им предоставляется поле, которое позволяет им добавлять свое имя и пароль, все это проходит и присутствует в консоли и журнале… единственный элемент, который не обновляется, — это account_id. — я добавлю данные консоли выше.

3. Это потому, что @user.update_attributes(:account_id => current_account.id ) сбой из-за ошибок проверки.

4. @infused, как я могу выполнить этот переход тогда? или просто удалить проверки?

Ответ №1:

@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
  

Комментарии:

1. Это потрясающе! Большое вам спасибо за вашу помощь! действительно ценю это!

Ответ №2:

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

 def create
  super
  User.where(email: params[:user][:email]).update_all(account_id: current_user.account.id)
end