Rails - 在创建新用户时创建其他类的新实例

时间:2013-03-07 12:54:28

标签: ruby-on-rails forms controller

我试图让它在应用程序中创建新用户时,已经为它们设置了所有内容。例如。他们有一个文件夹,他们将笔记保存到。因此,不必点击指向新文件夹的链接,然后在创建它的提交按钮,然后才能保存任何备注,是否可以在创建用户帐户时自动为它们设置一个?

E.g。

users_controller.rb:

def create
    @user.password = params[:password]
    respond_to do |format|
      if @user.save
         @folder = @user.folder.new(params[:folder]) # this is the line that I'm unsure how to implement

        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render json: @user, status: :created, location: @user }
      else
        format.html { render action: "new" }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

解决方案:

当我使用Devise时,我添加到我的用户控制器的路由被覆盖了,所以解决方案(可能有更好的方法来执行此操作!)是将代码添加到注册控制器中的after_user_sign_up_path,然后它执行得很好。

1 个答案:

答案 0 :(得分:0)

在您的操作中,您使用@user@user.folder的参数。

我建议使用nested_attributes

class User
  has_one :folder
  accepts_nested_attributes_for :folder
end

然后你可以这样写你的行动:

def create
  @user.update_attributes(params[:user])
  respond_to do |format|
    if @user.save
      # Here the folder is already saved!

      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render json: @user, status: :created, location: @user }
    else
      format.html { render action: "new" }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

应该有很多优点(虽然我没有全部检查过),其中包括:

  • 没有文件夹保存@user的风险(如果文件夹保存失败,用户保存失败)
  • @ user.errors应包含@user@user.folder
  • 的验证错误

但要做到这一点,你的params应该有不同的结构(用fields_for很容易实现):

user:
  password: "Any password"
  folder_attributes:
    any_attribute: "Any value"