2011-12-22 5 views
1

Ruby on Railsアプリケーションとホストされた支払いページ(http://support.cheddargetter.com/kb/hosted-payment-pages/hosted-payment-pages-setup-guide)を使ってCheddarGetterを統合しようとしています。ユーザーがログインする前にNet :: HTTPを使用してAPIからデータを要求していますか?

最後の部分を除いてすべてのことがわかりました。お客様のシステムにログインする前に顧客がまだアクティブであることを確認するために、顧客データをAPIからチェックしています。

明らかに、HTTPリクエストのいくつかの種類が関係しています。正直言って私はよく知っているわけではありません。申し訳ありません。コードは次のとおりです:

uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Get.new(uri.request_uri) 
status = http.request(request).body 

私はこのコードをどこに置くのがよいでしょうか?

私は考えているが、私のuser_session.rbモデルに次のように置く:

class UserSession < Authlogic::Session::Base 
    before_create :check_status 

    private 
    def check status 
     # insert above code here 
    end 
end 

しかし、私は、あまりにもわからないんだけど..?私は、おかげで..

答えて

1

私はそれ自身であることを置くことをお勧めします、いくつかの方向をお願い申し上げ

..もCheddarGetterのAPIはあなたを与えることを応答を参照すると、そこにはいくつかのif active? elsif cancelled? && pending?コードが存在しなければならない疑いがありますモジュールを/libディレクトリに置き、アクセスしようとしているWebサイトが利用できない場合にはTimeoutに呼び出しをラップします。私は下の一般的な例を作成したので、必要に応じて時間を調整することができます。 /lib/customer_status.rb

require 'timeout' 
module CustomerStatus 
    class << self 
    def get_status 
     begin 
     Timeout::timeout(30) { 
      uri = URI.parse("https://yoursite.chargevault.com/status?key=a1b2c3d4e6&code=yourcustomercode") 
      http = Net::HTTP.new(uri.host, uri.port) 
      http.use_ssl = true 
      http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
      request = Net::HTTP::Get.new(uri.request_uri) 
      status = http.request(request).body 
     } # end timeout 

     return status 

     rescue Exception => e 
     # This will catch a timeout error or any other network connectivity error 
     Rails.logger.error "We had an error getting the customer's status: #{e}" 
     end 
    end 
    end 
end 

インサイド

それからちょうどこのようにそれを呼び出すことができます。

class UserSession < Authlogic::Session::Base 
    # include the new module we added 
    include CustomerStatus 

    before_create :check_status 

    private 
    def check status 
    raise someError unless (CustomerStatus.get_status.include?("active")) 
    end 
end 

私はあなたが、pendingcancelledのために他のロジックに追加してみましょうよ顧客情報を新しいモジュールメソッドに渡すことができます。異なるステートを扱うためにswitchステートメントを使いたいかもしれません。また


更新

、あなたはすでにそれがオートロードパスにlibフォルダが追加されますので、あなたはそれを含めることを確認してください、あなたのconfig/application.rbファイルでこれを持っていない場合:

module YourAppNameGoesHere 
    class Application < Rails::Application 

    # Custom directories with classes and modules you want to be autoloadable. 
    config.autoload_paths += %W(#{config.root}/lib) 

    end 
end 
+0

非常に詳しい返信を書く時間を取ってくれてありがとう、ありがとう。私はそれが動作するかどうかを確認するために私のアプリケーションでコードを試して、私は "初期化されていない定数UserSession :: CustomerStatus"エラーがあります。何が間違っていると思いますか? – cdotfeli

+0

Railsサーバーを再起動しましたか? – iwasrobbed

+0

また、私の更新された答えをチェックして、Railsオートロードパスに 'lib'フォルダを追加して、起動時にそのモジュールをロードすることを知っていることを確認してください。 – iwasrobbed

関連する問題