2

total_priceのすべての製品のうち、cart本来あるべきように保存されていません。実際の合計金額に関係なく、常に1が表示されます。この問題は、moneygemとgoogle_currencygemをインストールした後に発生したため通貨だけでなく、選択したロケールに基づいて製品の価格自体を変更できます。

したがって、合計金額は常に1ですが、同時に、ショッピングプロセス中に画面に表示される金額は正しい数値を示します。つまり、価格AとBの2つの商品を選択してから、カート(画面上)に表示します。 )私は正しいtotal_price = A + Bを持っています。これ以上、クレジットカードのフィールドに入力した後に注文を作成するために押すと、ActiveMerchantはデータをpaypalに送信し、paypalに送金されるUSDの金額はカートA+Bにあるtotal_price。

問題は、アプリが正しいtotal_priceものを取得してペイパルに送信するのに、同時にこれtotal_priceを注文作成時にデータベースに保存できないため、代わりに1を保存する理由です。

注文を作成するときにコンソールが言うこと:

   (0.1ms)  BEGIN
  SQL (0.4ms)  INSERT INTO `orders` (`card_expires_on`, `card_type`, `cart_id`, `created_at`, `first_name`, `ip_address`, `last_name`, `total`, `updated_at`, `user_id`) VALUES ('2012-04-01', 'visa', 5, '2012-04-18 21:35:38', 'Rosca', '127.0.0.1', 'Sergiu', 1, '2012-04-18 21:35:38', 7)

order_transactionの詳細:

SQL (0.5ms)  INSERT INTO `order_transactions` (`action`, `amount`, `authorization`, `created_at`, `message`, `order_id`, `params`, `success`, `updated_at`) VALUES ('purchase', 1, '0GT41652PP785722H', '2012-04-18 21:35:46', 'Success', 5, '--- \nbuild: \"2764190\"\nAck: Success\ntimestamp: \"2012-04-18T21:35:45Z\"\nTransactionID: 0GT41652PP785722H\namount: \"42.00\"\namount_currency_id: USD\ntransaction_id: 0GT41652PP785722H\nack: Success\nBuild: \"2764190\"\navs_code: X\nversion: \"62.0\"\nTimestamp: \"2012-04-18T21:35:45Z\"\nCorrelationID: 690aa904db3c\nAmount: \"42.00\"\nAVSCode: X\nVersion: \"62.0\"\ncvv2_code: M\nCVV2Code: M\ncorrelation_id: 690aa904db3c\n', 1, '2012-04-18 21:35:46')

注文の作成方法に関するいくつかの詳細:

orders_controller.rb

  def create
    @order = current_cart.build_order(params[:order])
    @order.user_id = current_user.id
    @order.total = current_cart.total_price
#    raise current_cart.total_price.inspect
    @order.line_items = current_cart.line_items
    @order.ip_address = request.remote_ip
    if @order.save
      if @order.purchase
        Cart.destroy(session[:cart_id])
        session[:cart_id] = nil
      else
        render :action => "failure"
      end
        respond_to do |format|
          format.html { redirect_to products_path, :notice => 
          'Thank you for your order.' }
          format.json { render :json => @order }
        end
    else
       render :action => 'new'
    end
  end

コントローラでレイズインスペクトラインをアクティブにすると、

#<Money cents:4200 currency:USD> エラー。この場合、4200は2つの選択された製品のtotal_priceです。42.00米ドル。これは、total_price式が、アプリがデータベースに保存する必要がある時点まで正常に機能することを示すもう1つの証拠です。

合計金額:

total_pricecart.rbおよびline_item.rbで形成されます

line_item.rb

  belongs_to :order
  belongs_to :product
  belongs_to :cart
  belongs_to :user

  def total_price
    product.price * quantity
  end

cart.rb

has_many :line_items#, :dependent => :destroy
  has_one :order

  def to_s
    id
  end

  def add_product(product_id)
    current_item = line_items.find_by_product_id(product_id)
    if current_item
      current_item.quantity += 1
    else
      current_item = line_items.build(:product_id => product_id)
    end
    current_item
  end

  def total_price
    line_items.to_a.sum { |item| item.total_price }
  end

編集

データベースのorder.totalフィールドタイプはinteger(11)になりましたが、decimal(10,0)を使用して価格をセントで格納しようとしましたが、とにかく機能しませんでした。常に合計価格が1USDになりました。の価格productsはdecimal(10,0)です。

助けてくれて本当にありがとう..これに参加した将来の開発者にとって役立つかもしれません。

あなたが必要とするかもしれない他の情報があれば、私に知らせてください。

4

1 に答える 1

0

さて、フィールドをorder.totalからタイプdecimalに変更しましたが、float現在は正常に動作しています。私はペイパルに適切な金額を送っており、ユーザーのために作成された注文に適切な金額を送っています。使用する前は、フィールドタイプmoney gemでうまく機能していました。decimal

于 2012-04-19T11:58:34.630 に答える