我已使用托管字段设置了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文件中就有错误。那么,是否有更好的方法为已经设置了付款方式的现有客户创建表单?
谢谢,任何帮助将不胜感激!
答案 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”问题。