2011-07-08 12 views
0

モデルのインスタンスを作成する前に外部Webサイトにアクセスする必要があるモデルがあります。エラーリカバリのベストプラクティスとは何ですか?私はモデルを作成していないので、モデルのクラスメソッドを使用することに注意してください。モデルまたはコントローラでネットワーク接続エラーを救済するには?

(コントローラではなく)モデルのエラーを救済するのは正しいと思いますが、コントローラにエラーを伝える最も良い方法は何ですか?

class MyModel < ActiveRecord::Base 
    def self.lookup(address) 
    begin 
     return web_lookup(address) 
    rescue SocketError 
     return nil 
    end 
    end 
end 

class MyModelsController < ApplicationController 
    def create 
    info = MyModel.lookup(params[:address]) 
    if info 
     MyModel.create(:info => info) 
    else 
     flash_message('cannot lookup info') # I'd like to tell the user what failed here 
    end 
    end 
end 

をあなたがこれをアプローチする方法を次のコードの問題は、モデルがnilを返すので、コントローラが失敗したものをユーザーに任意のヒントを提供することができないということでしょうか?

(PS:モデルコードでMyModel.new(:info => info)を呼び出してコントローラコードに戻すことができます。これはモデルインスタンス[right?]にエラーを割り当てますそのAPIが公開APIの一部であるかどうかはわかりませんが、その場合はどうすれば記述できますか?)

答えて

1

コントローラで確実にレスキューしてください。コントローラは交通警察官であり、交通を適切な場所に誘導します。外部サーバへの接続、および障害発生時の対応するエラー処理は、そのトラフィック処理の一部です。したがって、100%コントローラの任務です。

+0

私は、WebアクセスがDelayed Jobまたは同等のものの下で処理されるべきであることを認識しています。そのため、物事の構造が根本的に変わることになります。それにもかかわらず、あなたの答えは理にかなっています。 –