2016-06-23 8 views
1

私のアプリでPaymentNotificationsControllerに入っているPaypal IPNがあります。しかし、いくつかの変数はカート内のアイテムの数に依存するので、PaymentNotificationを作成する前にそれらを抽出したいと思います。トリガーレールコントローラ機能 - Paypal Website標準IPN

これまでのところ、私が持っている:

class PaymentNotificationsController < ApplicationController 
    protect_from_forgery except: [:create] 
    def create 
     PaymentNotification.create!(params: params, 
     item_number: params[:item_number], item_name: params[:item_name], quantity: params[:quantity] 
     render nothing: true 
    end 
end 

通知がペイパルから来るときしかし、それはそうでitem_name1, item_number1, quantity1, item_name2, item_number2, quantity2との形式で提供されます。 ただ1つの項目であっても、item_name1, item_number1, quantity1, option1などとなります。

私は変数を抽出しようとするこの機能を持っていますが、私はどのように機能をトリガーするのか分かりません。私はコントローラの上部にbefore_actionを使ってみましたが、動作しませんでした。 wrong number of arguments(0 for 1)を返しました:

ITEM_PARAM_PREFIXES = ["item_name", "item_number", "quantity"] 

def extract_ipn_items_params(params) 
    item_params = [] 

    loop do 
    item_num_to_test = item_params.length + 1 
    item_num_suffix = item_num_to_test.to_s 
    possible_param_name = ITEM_PARAM_PREFIXES[0] + item_num_suffix 
    if params.include?(possible_param_name) 
     this_item_params = {} 
     ITEM_PARAM_PREFIXES.each do |prefix| 
     this_item_params[prefix] = params[prefix + item_num_suffix] 
     end 
     item_params.push this_item_params 
    else 
     return item_params 
    end 
    end 
end 

だから、私は、変数を抽出してのparamsにそれらを配置する機能をトリガーんか、聞いてるのよ[:ITEM_NUMBER]、のparams [:ITEM_NAME]、のparams:各項目の[数量]カート内に2つのアイテムがある場合、2つの個別の支払通知が作成されますか?

:両方のメソッドが同じPaymentNotificationsControllerです。

ご協力いただければ幸いです。前もって感謝します!

答えて

0

をすべての詳細を見ることができ、私はあなたができる、すでに必要なデータをフェッチextract_ipn_items_paramsあなたの方法を想定してpayment_idている必要がありますparamsはコントローラのactions/methodsで常に利用可能であるため、メソッドのparams引数を削除してください。ユーザー用に設定する属性を入れ子にしている場合、私はあなたが本当にわからない、のような何かを行うことができるはずだと思いますが、すべきで、

{1 => {item_name: 'Item 1', item_number: 1084, quantity: 15}}

ITEM_PARAM_PREFIXES = ["item_name", "item_number", "quantity"] 

def extract_ipn_items_params 
    mod_params = Hash.new{|k, v| k[v] = {} } 

    ITEM_PARAM_PREFIXES.each do |item_data_key| 
     key_tracker = 1 
     loop do 
      current_key = (item_data_key + key_tracker.to_s).to_sym 
      if params.include? current_key 
       mod_params[key_tracker][item_data_key] = params[current_key] 
      else 
       break 
      end 
      key_tracker += 1 
     end 
    end 
    mod_params 
end 

方法は次のようにハッシュのハッシュを返します。可能:

user.update(payment_notifications_attributes: extract_ipn_items_params)

は、それはあなたのために働くなら、私に教えてください。 Githubの骨子に基づき

UPDATE

は、ここで私が思い付くことができた何か:

class PaymentNotificationsController < ApplicationController 
    protect_from_forgery except: [:create] 

    ITEM_PARAM_PREFIXES = ["item_name", "item_number", "quantity", "option_name"] 


    def create 
    extract_ipn_items_params.each do |key, values| 
     # this approach loops through all the returned results, nested attributes may help abstract this though 
     PaymentNotification.create(values) 
     render nothing: true 
    end 

    def details 
    # params.extract_ipn_items_params #this doesn't exist as params is an instance of ActionController::Parameters 
    PaymentNotification.update_attributes(line_item_id: params[:item_number], product_title: params[:item_name], option_name: params[:option_name], quantity: params[:quantity]) 
    end 

    private 

    def additional_attributes 
     # create this for additional merge attributes. A better place for these would be the parent of this 
     { 
     params: params, 
     cart_id: params[:invoice], 
     status: params[:payment_status], 
     transaction_id: params[:txn_id], 
     first_name: params[:first_name], 
     last_name: params[:last_name], 
     email: params[:payer_email], 
     address_name: params[:address_name], 
     address_street: params[:address_street], 
     address_city: params[:address_city], 
     address_state: params[:address_state], 
     address_zip: params[:address_zip], 
     address_country: params[:address_country] 
     } 
    end 

    def extract_ipn_items_params 
     mod_params = Hash.new{|k, v| k[v] = {}.merge(additional_attributes) } 

     ITEM_PARAM_PREFIXES.each do |item_data_key| 
      key_tracker = 1 
      loop do 
       current_key = (item_data_key + key_tracker.to_s).to_sym 
       if params.include? current_key 
        mod_params[key_tracker][item_data_key] = params[current_key] 
       else 
        break 
       end 
       key_tracker += 1 
      end 
     end 
     mod_params 
    end 

end 

は、それはあなたの問題を修正した場合、私に教えてください。

+0

あなたの答えをありがとう。だから、 'create'アクションの前にこれを追加すれば、createを実行する前にアイテムを抽出するでしょうか?これは、ファイルの外観です。>> [https://www.dropbox.com/s/2f508296wb378wc/sublime.png?dl=0](https://www.dropbox.com/s/2f508296wb378wc/sublime.png ?dl = 0) –

+0

データはpaypalから 'PaymentNotificationsController'に送られます。 –

+0

いいえ、作成する前にこれを実行しても、必要な属性を抽出するだけで、パラメータの状態は変更されないため、パラメータATMには影響しません。この場合は、item_name、item_number、およびquantityです。これらのレコードをdbに挿入するには、いくつかの方法があります。あなたの 'PaymentNotificationsController'を示すGithub Gistを作成できますか?レコードを挿入するループを使用する別のアプローチで私の答えを更新することができました – oreoluwa

0

あなたはgem 'paypal-sdk-rest'

payment = PayPal::SDK::REST::Payment.find payment_id 

を使用してそれを見つけることができますので、あなたは決済対象に

+0

私はすでに詳細を見ることができます。通知が来ると、item_name、item_numberなどの変数からPayPalがitem_name1、item_number1としてそれらを送信するため、item_name、item_numberなどのように細かく作成されます。私は作成する前に通知からそれらを抽出するためのレールの方法が必要です! –

+0

私はPaypal Website Standardを使用していますが、REST APIは使用していません –