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/ –