0

我试图拥有它,以便在应用程序中创建新用户时,一切都已经为他们设置好了。例如,他们有一个文件夹,他们将笔记保存到其中。因此,在他们保存任何笔记之前,不必单击指向新文件夹的链接,然后单击提交按钮来创建它,是否可以在创建用户帐户时自动为他们设置一个?

例如

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

解决方案:

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

4

1 回答 1

0

在您的操作中,您同时使用参数 for@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

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

user:
  password: "Any password"
  folder_attributes:
    any_attribute: "Any value"
于 2013-03-07T14:43:55.430 回答