覆盖设计参数

时间:2019-01-14 13:18:41

标签: ruby-on-rails activerecord devise

我正在构建一个应用程序,该应用程序以一种形式采用管理员和公司并将两者连接起来。连接部分已设置为带有一个About_to关系(管理员属于公司)。

我遇到的问题是我正在使用Devise,它会自动使用我的所有参数并尝试吸引用户。问题是,在参数方面,公司只是一个名称字符串。因此,我需要建立公司,然后(大概)将company_id发送给Devise,或者在以后自行设置。

这是我在Admin:RegistrationController中尝试过的方法。

def create
  @company = Company.create(name: params[:admin][:company])
  super
  @admin.company = @company
end

这无法创建管理员,并且Devise返回错误“公司必须存在”。而且显然也很hacky(或至少有这种感觉)。

我在这里应该做什么,最佳实践是什么?谢谢!

2 个答案:

答案 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