2013-02-01 31 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/ –

相關問題