2013-02-01 22 views
0

在窗体的“创建”操作中,我成功地将(1)MyObject保存到本地数据库,(2)通过其Ruby API将(2)OtherObject保存到第三方数据库。当保存到第三方出现问题时,我会以Ruby异常的形式出现错误。Rails 3:如何从控制器的“创建”操作报告错误消息?

我的问题是:如何停止表单提交并向客户端报告异常消息?

如果这是不可能的,那么最好的选择是什么?

回答

1

根据是否要回滚本地数据库调用,您可能需要考虑使用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_torender,但是您始终可以根据是否是否为true来有条件地确定。

+0

说明:如果发生异常,在我尝试保存MyObject之前肯定会发生。我已经使用了一个begin ... rescue块(这是我捕获第三方异常的地方),但我不确定如何从该异常内报告页面上的消息...是否有意义? – user456584

+0

好吧,无论你需要“渲染”还是“重定向到一个”页面,在该页面上,你都可以显示你存储在“flash”中的错误。如果您不想离开页面并显示异常,则需要使用Ajax('form_for'上的':remote => true')提交表单,然后如果发生异常,请使用'。 js.erb'文件并使用Javascript显示错误。由于您在控制器代码中,因此您需要使用某种页面或Javascript进行响应。这有帮助吗? –

+0

如果您对这种Ajax方法感兴趣,下面是对Rails中Ajax表单的简要概述:http://trevorturk.com/2010/08/24/easy-ajax-forms-with-rails-3-and -jquery/ –

相关问题