ActiveRecord回滚会跳过模型级别的错误,以作为回应

时间:2019-01-11 07:22:26

标签: ruby-on-rails ruby exception activerecord transactions

这是来自控制器动作的代码(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)

当前尝试了多个选项,由于无法跳过回滚,因此没有帮助。

1 个答案:

答案 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