Rails:应该' double'在模型或控制器中创建用户类(具有多态关联)?

时间:2016-05-18 12:33:50

标签: ruby-on-rails polymorphism omniauth registration

我有一个具有不可分割的多态关联的用户类(取决于用户类型)。每次创建新用户时,还必须创建相应的用户类型模型。用户不仅可以通过常规注册创建,还可以使用omniauth(facebook,google)创建 问题是:我应该在每个操作中创建用户和用户类型,还是在用户模型中添加自定义创建功能,传递用户类型和一些参数,并在那里创建用户和用户类型?

以下是我的注册控制器的创建操作:

def create

if params[:type] == 'employee'
  @user_type = Employee.new sign_up_params[:user_type_attributes]
elsif params[:type] == "customer"
  @user_type = Customer.new sign_up_params[:user_type_attributes]
elsif params[:type] == "owner"
  @user_type = Owner.new sign_up_params[:user_type_attributes]
else
  flash[:notice]="Invalid parameter"
  redirect_to :controller=>'welcome', :action=>'register_choice'
  return
end

build_resource(sign_up_params)

if resource.valid? && @user_type.valid?

  ActiveRecord::Base.transaction do
    super do

      @user_type.save
      resource.user_type = @user_type

      if !@user_type.persisted? || !resource.persisted?
        clean_up_passwords resource
        set_minimum_password_length
        flash[:alert]="Error"
        raise ActiveRecord::Rollback
      end
    end
  end


else
  #TODO error messages
  clean_up_passwords resource
  set_minimum_password_length
  flash[:alert]="Error"
  respond_with resource
end  
end

1 个答案:

答案 0 :(得分:0)

如您所述,某些事情需要在创建用户后发生。 rails方式是添加" after_create"用户模型中的回调,用于处理创建用户后所需的内容。这将在添加到您的应用或与他人协作时保持一致性。