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

Creating a User must create a new Record with the id Parameter of the User

我有两个模型; 用户记录。我想在创建新用户时自动创建一个新记录。新的 Record 必须有一个属性,它是新创建的 User 的 id。

我读过有关使用 link_to 传递参数的信息,但我认为这不是我需要的。我希望代码位于创建操作的用户控制器中。

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

  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

为了检查它是否可以工作,我写了这个而不是以前的代码。它有效我有一个新记录,用户 ID 为 1

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

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

我尝试了几种选择:

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

试试下面的代码 -

 @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
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

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

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

user model 中:has_one :record

record model 中:belongs_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

仅此而已。

我认为@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