2

私はそれを作成して注文し、正常に実行して保存することができます。order モデルと order_transaction モデルを使用しています。注文フォームに記入して購読するときに、ユーザーがサイトに掲載される自分の写真をアップロードできるように、フィールドを追加しました。ユーザーが写真を添付する場合を除いて、プロセス全体は引き続き正常に機能します。その場合、クレジット カードの検証に失敗するだけです。アタッチメントを外すと、再び正常に機能します。

order.rb

class Order < ActiveRecord::Base

  has_many :transactions, :class_name => "OrderTransaction"

  attr_accessor :card_number, :card_verification, :card_expires_on, :response
  after_create :log_transaction

  attr_accessible :first_name,
                  :last_name,
                  :address_one,
                  :address_two,
                  :city,
                  :state,
                  :zip,
                  :country,
                  :email,
                  :verify_email,
                  :term,
                  :shirt_color,
                  :shirt_size,
                  :card_type,
                  :card_number,
                  :card_verification,
                  :transactions_attributes,
                  :card_expires_on_month,
                  :card_expires_on_year,
                  :photo


  has_attached_file :photo,
    :styles => { :medium => "320x320>", :thumb => "100x100#" }
  validates :first_name, :last_name, :address_one, :city, :state, :zip, :country, :presence =    > true
  validate :validate_card, :on => :create
  validate :require_shirt_size, :on => :create



  def purchase
    self.response = GATEWAY.purchase(price_in_cents, credit_card)
    errors.add(:base, response.message) unless self.response.success?
    self.response.success?
  end

  def credit_card
    @credit_card ||= ActiveMerchant::Billing::CreditCard.new(
      :type               => card_type,
      :number             => card_number,
      :verification_value => card_verification,
      :month              => card_expires_on_month,
      :year               => card_expires_on_year,
      :first_name         => first_name,
      :last_name          => last_name
    )
  end

  def price_in_cents
    total = 0

    if term == '1'
      total = 2000
    elsif term == '2'
      total = 3500
    elsif term == '3'
      total = 4500
    end
    unless shirt_color == 'none'
      total += 1599
    end

    total
  end

  def require_shirt_size
    unless shirt_color == 'none'
      if shirt_size == ''
        errors.add(:base, "Shirt Size required if ordering a shirt.")
      end
    end
  end

  private
    def log_transaction
      self.transactions.create!(:action => "purchase", :amount => price_in_cents, :response =    > self.response)
    end

    def validate_card

      unless credit_card.valid?
        credit_card.errors.full_messages.each do |message|
          errors.add(:base, message)
        end
      end
    end
end

order_transaction.rb

class OrderTransaction < ActiveRecord::Base

  attr_accessible :action, :amount, :response

  belongs_to :order
  serialize :params

  def response=(response)
    self.success       = response.success?
    self.authorization = response.authorization
    self.message       = response.message
    self.params        = response.params
  rescue ActiveMerchant::ActiveMerchantError => e
    self.success       = false
    self.authorization = nil
    self.message       = e.message
    self.params        = {}
  end
end

orders_controller.rb

def create
  @order = Order.new(params[:order])
  if @order.valid? && @order.purchase
    render :success and return
  else
    render :action => 'new'
  end
end

どういうわけか、写真を添付すると、クレジット カード データを渡す能力が失われるようです。どこでそれを失っているのかわかりませんが、そうです。ペーパークリップのバグのように感じます。アクティブマーチャントとの取引中にファイルのアップロードで同様の問題が発生した人はいますか? これはかなり単純な注文タイプで、3 つのサブスクリプション オプションがあります。

より良いテスト方法と何が起こっているかを確認する方法についての提案でさえ、非常に役立ちます。今はかなり行き詰まっています。

4

0 に答える 0