ruby-on-rails Rails如何同时回滚和渲染?

cygmwpex  于 2023-06-25  发布在  Ruby
关注(0)|答案(3)|浏览(177)

我需要渲染json,然后引发ActiveRecord::Rollback,可以吗?
场景就像API被调用,在一些操作失败后,我们需要让API用户知道错误是什么,并回滚执行的操作。
试过这个

render json: response, status: status
raise ActiveRecord::Rollback

这会引发错误"ActiveRecord::Rollback:ActiveRecord::回滚"
还有别的办法吗

kcugc4gi

kcugc4gi1#

可以将错误存储在示例变量中。如果存在错误,回滚事务,然后呈现错误消息。例如:

def your_action
  YourModel.transaction do
    @error = do_something
    raise ActiveRecord::Rollback if @error
  end

  return render json: { error: @error }, status: :bad_request if @error
  return render json: { data: "success" }, status: :ok
end

private

def do_something
  return :error01 if not operation1
  return :error02 if not operation2
  return :error03 if not operation3
  return nil
end
u59ebvdq

u59ebvdq2#

如果目的是创建一个预览,了解数据库将如何使用更改,然后回滚,我认为最好的方法是使用around_action过滤器。
这是Rails指南中的示例:
https://guides.rubyonrails.org/action_controller_overview.html#after-filters-and-around-filters

class ChangesController < ApplicationController
  around_action :wrap_in_transaction, only: :show

  private
    def wrap_in_transaction
      ActiveRecord::Base.transaction do
        begin
          yield
        ensure
          raise ActiveRecord::Rollback
        end
      end
    end
end
ogsagwnx

ogsagwnx3#

你可以这样做:

# app/controllers/your_controller.rb

def your_api_endpoint
  YourModel.transaction do
    # your operation 
    
    if something.save! # here `something` is an object of YourModel
      render status: :success, json: { message: "Successfully done." }
    else
      render status: :unprocessable_entity, json: { message: "Something went wrong." }
    end
  end
end

它会自动回滚你的数据。Thanks:)

相关问题