Braintree主持了增加CC的领域

时间:2016-04-29 14:52:46

标签: jquery ruby-on-rails braintree

我已使用托管字段设置了braintree付款,如下所示:

在JS文件中:

import matplotlib
matplotlib.use('macosx')

我在设置新客户时没有问题,当他们需要填写他们的CC细节时,但是,当我尝试设置现有客户时,JS文件由于不存在braintree.setup(client_token, "custom", { id: "my-sample-form", paypal: { container: "paypal-container" }, hostedFields: { number: { selector: '#my-credit-card-field', }, cvv: { selector: '#my-security-code-field', }, expirationDate: { selector: '#my-expiration-field', }, postalCode: { selector: '#my-postal-code-field', } }, }); 而失败等。

在我的new.html.erb中,我有类似的内容:

#my-credit-card-field

因此,我会向新客户询问cc详细信息,现有客户可以保存他们的付款方式信息。我的控制器里有这样的东西:

 <% unless current_user.has_payment_info? %>
     <div id="my-credit-card" readonly>**** **** **** <%= @last_4_number %></div>
 <% else %>
     <div id="my-credit-card-field"></div>
     <div id="my-security-code-field"></div>
     <div id="my-expiration-field"></div>
     <div id="my-postal-code-field"></div>
 <% end %>

我的问题:

如果我将现有客户表单的ID设置为def create @amount = params[:slider] @token = Braintree::Customer.find(current_user.braintree_customer_id).credit_cards.first.token unless current_user.has_payment_info? @result = Braintree::Transaction.sale( amount: @amount, payment_method_nonce: params[:payment_method_nonce], options: { store_in_vault: true }) else @result = Braintree::Transaction.sale( customer_id: current_user.braintree_customer_id, amount: @amount, payment_method_token: @token) end if @result.success? #Some codes here end end ,则由于托管域选择器js,他们需要填写详细信息。如果我没有设置任何选择器,那么JS文件中就有错误。那么,是否有更好的方法为已经设置了付款方式的现有客户创建表单?

谢谢,任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

嗯,你可以做两件事之一。

选项1:简单的黑客攻击。

如果您不需要Braintree,请将div添加到您表单外的页面上的位置,如:

 <div style="display:none" id="my-credit-card-field"></div>
 <div style="display:none" id="my-security-code-field"></div>
 <div style="display:none" id="my-expiration-field"></div>
 <div style="display:none" id="my-postal-code-field"></div>

现在,在页面加载时,Braintree会找到它们并填充它们,但不会提交任何内容。

当然,当你需要它时,只是不要将这些隐藏的div添加到页面中(因为它们已经存在于表单中)。

选项2(推荐):使用部分内容。

如果你不需要Braintree,那么甚至不需要调用javascript,对吧?因此,您可以将javascript移动到仅在必要时添加到页面的部分内容中。这样,在这种情况下,Braintree甚至都没有尝试调用填充div,所以没有错误。只需在条件块中包含渲染调用。

虽然选项1肯定更快,但我会推荐选项2,因为它可能是“正确”的方法,当你忘记黑客时,你会避免“为什么我们有他的隐藏div”问题。