如何在设计注册后创建模型

时间:2014-03-16 03:27:55

标签: ruby-on-rails devise

我有一个名为“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。有没有更好的方法呢?

3 个答案:

答案 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保存失败,用户不会分配idif 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

参考其他Active Record Callbacks

答案 2 :(得分:0)

您可以使用resource变量

访问新创建的用户

此处,我仅在用户实际保存时才记录信息

class RegistrationsController < Devise::RegistrationsController

    def create
        super

        if resource.persisted?
            Rails.logger.info("Just created and saved #{resource}");
        end
    end
end