私はそれを作成して注文し、正常に実行して保存することができます。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 つのサブスクリプション オプションがあります。
より良いテスト方法と何が起こっているかを確認する方法についての提案でさえ、非常に役立ちます。今はかなり行き詰まっています。