フォームの「作成」アクションで、(1)MyObjectをローカルデータベースに保存し、(2)OtherObjectをRubyAPIを介してサードパーティのデータベースに保存しました。サードパーティへの保存で問題が発生すると、Ruby例外の形式でエラーが発生します。
私の質問は、フォームの送信を停止して例外メッセージをクライアントに報告するにはどうすればよいですか?
これが不可能な場合、最善の選択肢は何でしょうか?
フォームの「作成」アクションで、(1)MyObjectをローカルデータベースに保存し、(2)OtherObjectをRubyAPIを介してサードパーティのデータベースに保存しました。サードパーティへの保存で問題が発生すると、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