这是来自控制器动作的代码(Rails 3.2),User是父代,并且与Poster和Card具有has_many关联。如果用户对象保存失败,我想还原所有执行的查询。
当前@user.update_attributes!
会为任何错误提供ActiveRecord异常,并发生回滚。
除了回滚,我还希望其他对象(子依赖项)的错误也作为响应发送,而由于代码永远不会进入异常,因此会被遗漏。
def update
@user = User.includes(:posters).includes(:cards).find(params[:id])
respond_to do |format|
format.json do
ActiveRecord::Base.transaction do
@user.cache_background_data
@user.disable_messages
@user.selected_tgs = params["up"] && params["up"]["s_tgs"]
if @user.valid? && @user.update_attributes!(ng_user_params)
render :json => Oj.dump(user_as_json(@user), mode: :compat)
else
render :json => Oj.dump({:errors => @user.errors}, mode: :compat)
end
end
end
end
end
我尝试使用下面的代码通过抢救来处理此问题,在此流程中不会触发回滚。可以强制处理回滚(raise ActiveRecord::Rollback
)并在响应中附加所有自定义ActiveRecord错误消息吗?
rescue ActiveRecord::ActiveRecordError => e
ng_collect_errors
render :json => Oj.dump({:errors => @user.errors}, mode: :compat)
当前尝试了多个选项,由于无法跳过回滚,因此没有帮助。
答案 0 :(得分:0)
尝试手动提高回滚
ActiveRecord::Base.transaction do
@user.cache_background_data
@user.disable_messages
@user.selected_tgs = params["up"] && params["up"]["s_tgs"]
if @user.valid? && @user.update(ng_user_params)
render :json => Oj.dump(user_as_json(@user), mode: :compat)
else
render :json => Oj.dump({:errors => @user.errors}, mode: :compat)
raise ActiveRecord::Rollback
end
end