#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