4

サブスクリプション、ギフトのサブスクリプション、購入など、さまざまなサービスのさまざまな種類のトランザクションを処理するアプリケーションを構築しています。

ギフト取引とアクティブマーチャントに問題があります。それがどのように機能するかの簡単な概要を説明します。

ユーザーはギフト サブスクリプションを作成し、そのデータを入力します。データはデータベースに保存され、カスタムの "show_view" で確認するためにユーザーに表示されます。次に、ユーザーは別のフォームにクレジット カード情報を入力し、彼がデータを送信すると、コントローラーからのメソッドが呼び出されてトランザクションが処理されますが、ここで問題が発生します。

これは gift_subscription.rb モデルです

    def gift_purchase
    response = GATEWAY.purchase(price, credit_card, gift_purchase_options)
    GiftTransaction.create!(:action => "gift_purchase", :amount => price, :response => response)
    response.success?
  end
  private
  def gift_purchase_options
    {
        :ip => ip_address,
        :billing_address => {
            :name     => name + last_name,
            :address1 => address1,
            :city     => city,
            :state    => state,
            :country  => "Mexico",
            :zip      => zip
        }
    }
  end

  def validate_card
    unless credit_card.valid?
      credit_card.errors.full_messages.each do |message|
        errors[:base] << message
      end
    end
  end

  def credit_card
    @credit_card = ActiveMerchant::Billing::CreditCard.new(
        :brand              => card_type,
        :number             => card_number,
        :verification_value => card_verification,
        :month              => card_expires_on.month,
        :year               => card_expires_on.year,
        :first_name         => name,
        :last_name          => last_name
    )

そして、ここにgift_subscription_controller.rbがあります

def review
    @gift_subscription = GiftSubscription.find(params[:id])
  end

  def edit_review
    @gift_subscription = GiftSubscription.find(params[:id])
  end

  def update_review
  @gift_subscription = GiftSubscription.find(params[:id])

    respond_to do |format|
      if @gift_subscription.update_attributes(params[:gift_subscription])
        format.html { redirect_to "gift_subscriptions/review/#{@gift_subscription.id}", :notice => 'Gift subscription was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render :action => "edit_review" }
        format.json { render :json => @gift_subscription.errors, :status => :unprocessable_entity }
      end
    end
  end

  def do_gift_transaction
    @gift_subscription = GiftSubscription.find(params[:id])
    if @gift_subscription.gift_purchase
        redirect_to '/thank_you'
    else
        redirect_to "/gift_subscriptions/#{@gift_subscription.id}/failed_transaction"
    end
  end

  def failed_transaction
    @gift_subscription = GiftSubscription.find(params[:id])
    @gift_transactions = @gift_subscription.gift_transactions
  end

  def transaction_details
    @gift_subscription = GiftSubscription.find(params[:id])
  end

もう少し明確にするために、コントローラーの create メソッドから、何かを変更したい場合に備えて edit_review があるレビュー アクションにユーザーをリダイレクトし、次に transaction_details に移動してクレジットカード情報を入力し、最後にメソッド do_gift_transaction が呼び出されます実際に取引を行います。

私が得るエラーは次のとおりです

NoMethodError in GiftSubscriptionsController#do_gift_transaction

undefined method `month' for nil:NilClass
Rails.root: /home/peanut/RubymineProjects/GiftBox

Application Trace | Framework Trace | Full Trace
app/models/gift_subscription.rb:44:in `credit_card'
app/models/gift_subscription.rb:12:in `gift_purchase'
app/controllers/gift_subscriptions_controller.rb:113:in `do_gift_transaction'

私は周りを見回してきましたが、月が認識されない理由が見つからないようです...他のサブスクリプションについては、基本的に同じモデル(いくつかの違い)がありますが、完全に機能します。ここで何か助けていただければ幸いです。

GiftSubscription モデルの属性

attr_accessible :response, :name, :last_name, :address1, :address2,:city,
                  :state, :zip, :card_type, :ip_address, :price,
                  :duration, :created_at, :card_expires_on, :card_number,
                  :card_verification, :message

  has_one :gift_transactions, :class_name => "GiftTransaction"
  attr_accessor :card_number, :card_verification
  validate :validate_card, :on => :transaction_details
4

1 に答える 1

0

数時間頭を悩ませた後、それは非常に単純であることが判明しました...クレジットカードデータを入力するビューでは、dbに保存されるはずのフィールドが保存されていませんでした.link_toボタンしかなかったからです。続行するには、credit_card メソッドが呼び出されたときに空でした。

これを指摘してくれたlander16に感謝します。

于 2012-10-19T01:52:27.587 に答える