创建用户必须使用用户的id参数创建新记录

时间:2015-08-20 10:26:57

标签: ruby-on-rails parameters controller

我有两个型号; 用户记录。我想在创建新用户时自动创建新记录。新记录必须具有属性,该属性是新创建的用户的ID。

我已经阅读过使用link_to来传递参数,但我认为这不是我需要的。我希望代码在create action中位于User Controller中。

所以我在我的控制器中编写了这段代码:

  def create
    @user = User.new(user_params)

    @record = Record.new(:user_id=>@user.id)
    @record.save

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
      format.js
    end
  end

要检查它是否可行,我写了这个而不是前面代码中的内容。它的工作原理我有一个新的记录,其用户名为1

    @Record = Record.new(:user_id=>"1")
    @Record.save

如何获取创建的用户的ID而不是1?

我尝试了几种选择:

params[:id]
User.find(params[:id])

4 个答案:

答案 0 :(得分:1)

尝试以下代码 -

 @user = User.new(user_params)
 @user.build_record # if you have has_one association in user model
 @user.records.build # if you have `has_many` association in user model

 @user.save

所以你的控制器代码应该是 -

def create
    @user = User.new(user_params)
    @user.build_record

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
      format.js
    end
  end

答案 1 :(得分:0)

class User
  has_many :records, autosave: true

  after_initialize {
    # this is automatically creating a new record element
    # and save its association, but only if its a new record (user)
    records.build if self.new_record?
  }
end

#in your controller
def create
   @user = User.new(user_params)
      respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render :show, status: :created, location: @user }
    else
      format.html { render :new }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
    format.js
  end
end

答案 2 :(得分:0)

我最终找到了一个效果很好的解决方案。 这是我在控制器中使用的代码,因此创建用户会自动创建一个带有用户ID的记录

我必须准确地说我对这两个模型有以下关系:

user modelhas_one :record

record modelbelongs_to :user

  def create
    @user = User.new(user_params)


    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
        @record = Record.create(user: @user)
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

这就是全部。

答案 3 :(得分:0)

我不认为@ GDMN的答案中的代码会有效。

一旦保存了用户记录,如果请求的类型为html,它将重定向,或者在json请求的情况下呈现某些内容。这行@record = Record.create(user: @user)将执行除html和json之外的请求类型,否则将执行。您可以使用从@ Vishnu的回答

复制的以下代码
@user = User.new(user_params)
@user.build_record

respond_to do |format|
  if @user.save
    format.html { redirect_to @user, notice: 'User was successfully created.' }
    format.json { render :show, status: :created, location: @user }
  else
    format.html { render :new }
    format.json { render json: @user.errors, status: :unprocessable_entity }
  end
  format.js
end