我有一个名为“company_name”的额外字段的用户注册。创建用户后,我希望基于额外字段“company_name”和与该公司关联的用户创建公司实例。我尝试过这样的一些事情:
class RegistrationsController < Devise::RegistrationsController
def new
super
end
def create
super
company = Company.create(name: params[:company_name])
current_user.admin = true
current_user.company = company
current_user.save
end
def update
super
end
end
但是,在创建公司后尝试执行这些行时,我没有current_user。有没有更好的方法呢?
答案 0 :(得分:2)
您可以将一个块传递给Devise控制器create
,它将为您提供创建的用户资源:
class RegistrationsController < Devise::RegistrationsController
CREATE_COMPANY_PARAMS = [:name]
def create
super do |created_user|
if created_user.id
company = Company.create! create_company_params
created_user.update! company_id: company.id
end
end
end
private
def create_company_params
params.require(:user).require(:company).permit(*CREATE_COMPANY_PARAMS)
end
end
但要正确处理这个问题有一些困难的部分。
似乎即使用户已经存在,它仍然会调用您的块并传递给您一个用户,但是由于DB保存失败,用户不会分配id
。 if created_user.id
检查会阻止为无效用户创建公司。
如果公司已经存在。 .create!
将抛出异常,导致控制器返回HTTP 422。
答案 1 :(得分:1)
在User
模型中使用after_save
回调可能适合这种情况:
# app/models/user.rb
class User < ActiveRecord::Base
...
# Execute this callback after an record is saved only on create
after_save :create_and_associate_company, on: :create
private:
def create_and_associate_company
company = self.companies.build
# Other necessary attributes assignments
company.save
end
end
答案 2 :(得分:0)
您可以使用resource
变量
此处,我仅在用户实际保存时才记录信息
class RegistrationsController < Devise::RegistrationsController
def create
super
if resource.persisted?
Rails.logger.info("Just created and saved #{resource}");
end
end
end