在表单上的"创建"操作中,我成功地将(1)MyObject保存到我的本地数据库,(2)OtherObject通过其Ruby API保存到第三方数据库。当保存到第三方出现问题时,我会收到 Ruby 异常形式的错误。
我的问题是:如何停止表单提交并向客户报告异常消息?
如果这是不可能的,最好的选择是什么?
根据是否要回滚本地数据库调用,您可能需要考虑使用事务。大致如下:
def create
ActiveRecord::Base.transaction do
@myobject = MyObject.create!(params[:myobject])
begin
# call third-party
rescue Exception => e
flash[:exception] = e.message
raise ActiveRecord::Rollback # Raise this to cause a rollback on MyObject
end
end
# redirect_to or render... might have to pick depending on if you got an exception
end
这会将异常消息存储到可用于向用户显示的flash
中。注意不要将整个Exception
对象存储到flash
中,如果您的异常对象太大,您肯定会看到溢出错误。
如果您不太关心回滚MyObject
创建,那么您可以使用一个简单的begin
......rescue
类似于我在示例中显示的内容。您可能需要根据是否发生异常来确定是要执行redirect_to
还是render
,但始终可以根据flash[:exception].nil?
是否true
有条件地确定。