2016-10-19 5 views
0

Я застрял и не знаю, как добавить «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 

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

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

+0

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

+0

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

+0

Это потому, что '@ user.update_attributes (: account_id => current_account.id)' терпит неудачу из-за ошибок проверки. – 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 
+0

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

0

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

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