我有一个用于注册的FormObject
,它在create
方法中为用户创建了一个批量模型。
def create
ActiveRecord::Base.transaction do
@user = User.create(@params[:user])
process_bonuses_for_user
process_actions_for_user
# et.c., giant amount of methods
end
@user.persisted? # to return the true of false to controller
end
我遇到了我的FormObject
的奇怪行为。即使它运行成功(创建了很多模型)或不成功(没有保存它们),User
模型的id
也在自动递增。因此,每次尝试使用我的FormObject
保存内容时,都会为User增加下一个id
的值。当User
创建成功时,这是正常情况,但当用户在注册表单上出错时,这就不正常了
如何禁用这种不可预测的行为?
附言:当我在create
方法的开头写@user = User.new(@params[:user])
,在结尾写@user.save
时,我知道一切都是有效的,但有很多关联,我不想在我的模型中写很多autosave
或inverse_of
。
p.p.S.我是postgresql-9.4
用户
您的事务无法工作,因为您使用的是create
。您需要使用bang版本(create!
)在失败时引发异常,从而触发回滚。请注意,您需要自己rescue
InvalidRecord
异常。
在我看来,它可能是这样的:
def create
@user = User.new(params[:user])
respond_to do |format|
if @user.save
process_bonuses_for_user
process_actions_for_user
# et.c., giant amount of methods
...
format.html { redirect_to ... }
end
end