2016-05-06 13 views
0

にリダイレクトされました。別の開発者が作業していたプロジェクトを手渡されました。このコードは、ショッピングウェブサイトからいくつかの購入を取り込み、価格を探してユーザーに通知します。標準エラーがページ

「結果が見つかりません」のようなエラーが発生し、標準エラーが発生することがあります。

エラーページにユーザーをリダイレクトして通知するが、コントローラーではないために通知できないため、redirect_toオプションは機能しません。

サービス/ purchase_checker.rbは1時間に1回呼び出されます。

 def call 
     user.transaction do 
      store_purchase 
      if better_purchase? 
      update_purchase 
      end 
     end 
     rescue MyError=> e 
     store_error(e) 
     end 



def store_error(error) 
    user.check_errors.create!(error_type: error.class.name, message: error.message) 
    end 

サービス/ my_error.rb:

class MyError< StandardError 

    def initialize(error_type, error_message) 
    super(error_message) 
    @error_type = error_type 
    end 

    attr_reader :error_type 

end 

サービス/ purchase_fetcher.rb:

def parse_result_page 
    raise purchase_form_page.error if purchase_form_page.error.present? 
    offer = purchase_page.map{|proposal_section| 
      propose(proposal_section, purchase) } 
          .min_by(&:price) 

    offer or raise MyError.new("No results", "No results could be found") 
    end 
+0

あなたはコントローラのアクションを掲示し、どこPurchaseChecker番号コールが呼び出されることはできますか? –

+0

これはアクティブジョブによって呼び出された – MaxDBN

+0

あなたが後にしていることは不明です:ジョブが毎時実行されている場合、要求/応答サイクルでユーザーのリダイレクトが提案されますか? –

答えて

0

このジョブで実行されているので、ユーザーに通知するための最良の方法は、電子メールであること、または何らかの他の非同期通知方法でしょう。エラーが検出されると、電子メールが送信されます。

これは何らかの理由でオプションではない場合、ユーザーが該当するコントローラにcheck_errorsを持っているかどうかを確認できます。エラーが見つかったときに呼び出されるstore_error(error)メソッドを見ると、データベースにエラーを記録するための新しいレコードが作成されているようです。ユーザーにuser.check_errorsの関係でログに記録されたエラーがあるかどうかを確認することができます。

あなたは、たとえば、このようにそれを行うことができます:

class SomeController < ActionController::Base 
    # ... 
    before_action :redirect_if_check_errors 

    # ... 

    def redirect_if_check_errors 
    # Assuming you're using Devise or something similar 
    if current_user && current_user.check_errors.exists? 
     redirect_to some_error_page_you_create_for_this_path 
    end 
    end 
end 

これはSomeControllerのすべてのアクションでこれらのエラーをチェックし、あなたがエラーをレンダリングし、作成する必要がありますエラーページにユーザーをリダイレクトしますuser.check_errorsの関係。

これを行うには複数の方法がありますが、ユーザーに積極的に通知したい場合は、ジョブからメールを送信する方が良い方法だと思います。例えば、user.check_errorsにそのようなものがあるとユーザに警告するインタフェース要素を追加することもできます。

1

あなたがすべき別のエラークラスを作成します(例:NotFoundError

)。その後、あなたのコントローラで10
offer or raise NotFoundError.new("No results", "No results could be found") 

begin 
    parse_result_page 
rescue NotFoundError => e 
    redirect_to err_page, :notice => e.message 
end 
+0

私はこのオブジェクトのコントローラを持っていません。エラーは別のオブジェクトで発生します。コントローラーではないのでリダイレクトは使用できません – MaxDBN

+0

バックグラウンドジョブは使用しないでください。非同期であるため、フィードバックを受け取ることができません。 –

+0

実行されました。ユーザーが検索を行った直後の最初の時間。結果がないことを彼に通知する必要があります – MaxDBN

0

私はこれを同期して行い、応答が要求/応答サイクルで直接発生するように提案します。おそらく、このような何か:

# controller

def search 
    # do your searching 
    # ... 
    if search_results.blank? 
    # call model method, but do it synchrously 
    purchase_check = PurchaseChecker.call 
    end 

    if purchase_check.is_a?(MyError) # Check if it's your error 
    redirect_to(some_path, flash: { warning: "Warn them"}) 
    end 
end 

# model, say PurchaseChecker

def call 
    # do your code 
rescue MyError => e 
    store_error(e) 
    e # return the error so that the controller can do something with it 
end 
関連する問題