0
在窗体的“创建”操作中,我成功地将(1)MyObject保存到本地数据库,(2)通过其Ruby API将(2)OtherObject保存到第三方数据库。当保存到第三方出现问题时,我会以Ruby异常的形式出现错误。Rails 3:如何从控制器的“创建”操作报告错误消息?
我的问题是:如何停止表单提交并向客户端报告异常消息?
如果这是不可能的,那么最好的选择是什么?
在窗体的“创建”操作中,我成功地将(1)MyObject保存到本地数据库,(2)通过其Ruby API将(2)OtherObject保存到第三方数据库。当保存到第三方出现问题时,我会以Ruby异常的形式出现错误。Rails 3:如何从控制器的“创建”操作报告错误消息?
我的问题是:如何停止表单提交并向客户端报告异常消息?
如果这是不可能的,那么最好的选择是什么?
根据是否要回滚本地数据库调用,您可能需要考虑使用Transactions。沿着这些路线的东西:
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
,但是您始终可以根据是否是否为true
来有条件地确定。
说明:如果发生异常,在我尝试保存MyObject之前肯定会发生。我已经使用了一个begin ... rescue块(这是我捕获第三方异常的地方),但我不确定如何从该异常内报告页面上的消息...是否有意义? – user456584
好吧,无论你需要“渲染”还是“重定向到一个”页面,在该页面上,你都可以显示你存储在“flash”中的错误。如果您不想离开页面并显示异常,则需要使用Ajax('form_for'上的':remote => true')提交表单,然后如果发生异常,请使用'。 js.erb'文件并使用Javascript显示错误。由于您在控制器代码中,因此您需要使用某种页面或Javascript进行响应。这有帮助吗? –
如果您对这种Ajax方法感兴趣,下面是对Rails中Ajax表单的简要概述:http://trevorturk.com/2010/08/24/easy-ajax-forms-with-rails-3-and -jquery/ –