我正在构建一个应用程序,该应用程序以一种形式采用管理员和公司并将两者连接起来。连接部分已设置为带有一个About_to关系(管理员属于公司)。
我遇到的问题是我正在使用Devise,它会自动使用我的所有参数并尝试吸引用户。问题是,在参数方面,公司只是一个名称字符串。因此,我需要建立公司,然后(大概)将company_id发送给Devise,或者在以后自行设置。
这是我在Admin:RegistrationController中尝试过的方法。
def create
@company = Company.create(name: params[:admin][:company])
super
@admin.company = @company
end
这无法创建管理员,并且Devise返回错误“公司必须存在”。而且显然也很hacky(或至少有这种感觉)。
我在这里应该做什么,最佳实践是什么?谢谢!
答案 0 :(得分:1)
您可以覆盖#build_resource
以加入original #create
implementation:
class Admin:RegistrationController < ::Devise::RegistrationsController
def build_resource(hash = {})
super
if action_name == "create"
self.resource.company ||= Company.create
end
end
end
但是,从用户体验的角度来看,最好是让用户通过选择来选择现有公司,或者使用accepts_nested_attributes来让用户填写公司字段。
您还可以将关联设置为可选,并让用户在注册后填写公司详细信息。
最佳做法是什么?
无论哪种方式都能按时完成要求。
答案 1 :(得分:0)
create覆盖文件夹app / controllers / admins / registration_controller.rb中的一个新文件 并在下面添加此命令(部分是设计标准命令)
class Admins::RegistrationsController < Devise::RegistrationsController
def create
build_resource(sign_up_params)
@company = Company.create(name: params[:admin][:company])
# resource is standard
resource.company = @company
resource.save
end
end