如何使用没有硬编码值的Braintree :: Transaction.sale成功检出?

时间:2017-11-27 17:49:54

标签: ruby-on-rails ruby payment braintree braintree-sandbox

我能够用硬编码的数量成功结账,即:

def checkout
    nonce = params["payment_method_nonce"]

    if current_user.braintree_id?
        customer = Braintree::Customer.find(current_user.braintree_id)
    else
        @result = Braintree::Customer.create(
            email: current_user.email,
            payment_method_nonce: params[:payment_method_nonce]
          )
          customer = result.customer
          current_user.update(braintree_id: customer.id)
end

     @result = Braintree::Transaction.sale(
      amount: **"10.00"**,
      payment_method_nonce: nonce
    )

    if @result.success? 
        redirect_to root_path, notice: "You have successfully checked out"
    else
        flash[:alert] = "Something went wrong while processing your transaction"
        render :new
    end
end

让我们说我希望current_user能够以特定的价格购买我的投资组合的访问权限。它已存储在我的rails数据库中。有没有办法通过从数据库中的对象属性中提取数量来设置金额,即:"< = @portofolio_item.price>" ??我尝试了多次尝试并且没有任何运气。我能做错什么?

1 个答案:

答案 0 :(得分:1)

正如Rails框架的文档中所述:

ActiveRecord Basics

您需要从PortfolioItems模型的表中映射一个新字段。为了做到这一点,您首先需要通过创建迁移将该字段添加到表中,我建议使用小数,因为如果您在逗号后限制ammount,浮动可能会导致问题。

每个portfolio_item都应该将它的定价存储为十进制,比例为2:

t.decimal :price, scale: 2, precision: 5

这将允许该项目具有与之关联的价格,并将使方法:@portfolio_item.price可用。

然后你只需要在控制器中更换:

 @result = Braintree::Transaction.sale(
      amount: **"10.00"**,
      payment_method_nonce: nonce
    )

使用:

 @result = Braintree::Transaction.sale(
      amount: @portfolio_item.price,
      payment_method_nonce: nonce
    )