在覆盖Devise用户控制器时,制作新模型的最佳方法是什么?

时间:2014-05-02 09:02:34

标签: ruby-on-rails devise

我试图做到这一点,以便在创建新用户时(通过设计),如果不存在具有该名称的先前家庭模型,则将创建新的家庭(实质上是组)模型。

伪代码:

if Household.find(params[:household_name))
  # allow current_user to join household
else
 # create new Household model with User's household_name parameter
end

我已经使用controllers / registerhousehold_controller.rb从Devise :: RegistrationsController覆盖了基本用户控制器:

class RegisterhouseholdController < Devise::RegistrationsController

但我不确定如何在这里实施实际的创作。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

据我所知,控制器无需更改。

<强> User.rb

after_create :create_or_join_to_household

def create_or_join_to_household
 household = Household.find(params[:household_name])
 if household.present?
   self.join_to_household
 else
   Household.create(name: params[:household_name])
   #or self.households.create(name: params[:household_name])
   #if you have a household - user relation somehow
end

P.S。

join_to_household将是您的用户模型中另一种创建household_users关系的方法。

答案 1 :(得分:0)

简单 - 使用user模型中的before_create回调来构建对象,然后您可以在保存时使用它:

#app/models/user.rb
Class User < ActiveRecord::Base
    before_create :set_household, if: Proc.new {|user| user.household_id.present? }

    private

    def set_household
        if house = Household.find(self.household_id)
           #if it is set
        else
           #create a new houshold
        end
    end
end

答案 2 :(得分:0)

在我之前的任务中,我必须在成功注册后调用自定义方法。 你也需要类似的东西。

我不确定是否会覆盖。

在App中试试这个。控制器

class ApplicationController < ActionController::Base

def after_sign_in_path_for(resource)
 if Household.find(params[:household_name))
    # allow current_user to join household
 else
    #create new Household model with User's household_name parameter
 end
 root_path
end

end

检查this