我有两个型号; 用户和记录。我想在创建新用户时自动创建新记录。新记录必须具有属性,该属性是新创建的用户的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])
答案 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 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
这就是全部。
答案 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