如何使用组织关联创建新用户

时间:2014-08-25 21:10:38

标签: ruby-on-rails forms ruby-on-rails-4 associations

在我的webapp中,我的用户注册页面有一个组织名称字段。我有一个has_many :users的组织模型,以及我的用户模型belongs_to :organization。创建新用户时,我希望组织名称值用于创建新的组织记录,并将其与用户关联,以便user.organization_id =新的组织ID。

这是我的users_controller.rb代码:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def show
    @user = User.find(params[:id])
    @organization = Organization.find(@user.organization_id)
  end

  def create
    @organization = Organization.new(organization_params)
    @user = User.new(user_params)
    if @user.save && @organization.save
      sign_in @user
      redirect_to @user
      flash[:success] = "Welcome to the App!"
    else
      flash.now[:danger] = "Uh oh, there's been an error"
      render 'new'
    end
  end



  private
    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    def organization_params
      params.require(:organization).permit(:name)
    end
end

现在,当用户提交注册表单时,正在创建用户记录和组织记录,但不保存关联。 user.organization_id值为nil。

你能评论一下是什么问题吗?如果有一个好方法可以做我想做的事 - 也许用.build?

谢谢! 布伦南

2 个答案:

答案 0 :(得分:1)

是的! .build可以工作,但由于它只有一个关联,你将在构建命令中使用关联名称,即build_organization

def create
  @user = User.new(user_params)
  @user.build_organization(organization_params)
  if @user.save
    blah blah blah

如果以这种方式完成,您只需要保存用户(而不是@organization),因为这种关联得到了处理。

答案 1 :(得分:0)

在user_params permit:organization_id;)

def user_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation, :organization_id)
end

编辑:您还需要为用户设置organization_id - 如果您没有在表单中进行设置(例如使用select或其他字段),您可以使用.build方法。