我有一个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
的奇怪行为。即使它成功运行(创建了很多模型)或不成功(不保存它们),id
User
模型也会自动增量。因此,每个尝试使用FormObject
保存内容的人都会为User增加下一个id
的值。这是User
成功创建时的正常情况,但是当用户在注册表单上出错时不正常。
如何禁用这种不可预测的行为?
P.S。我知道当我在@user = User.new(@params[:user])
方法的开头create
和最后@user.save
处写autosave
时一切正常,但有很多关联,我不想要在我的模型中写了很多inverse_of
或postgresql-9.4
。
P.P.S。我是<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<set android:interpolator="@android:anim/decelerate_interpolator" android:fillBefore="false">
<alpha
android:duration="1200"
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
<translate
android:duration="1200"
android:fromYDelta="70%p"
android:toYDelta="0%p"/>
</set>
</set>
用户
答案 0 :(得分:0)
您的交易无效,因为您使用的是create
。您需要使用爆炸版本(create!
)来引发故障异常,从而触发回滚。请注意,您自己需要rescue
InvalidRecord
例外。
答案 1 :(得分:0)
在我看来,它可能是这样的:
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