scss: form { margin: auto; max-width: 40em; text-align: center; fieldset { max-width: 25em; margin: 2em auto; label { display: block; } input[type=number] { max-width: 3em; } small { display: block; } } button { display: block; width: 10em; margin: auto; } } form method="post" action="" #braintree | Unfortunately, our credit card processor requires JavaScript. fieldset legend Auto top-up when account balance is low? label | When balance drops below $5, add $ input type="number" name="auto_top_up_amount" min="15" value=auto_top_up small Leave blank for no auto top-up. input type="hidden" name="customer_id" value=customer_id input type="hidden" name="braintree_nonce" script src="https://js.braintreegateway.com/web/dropin/1.26.0/js/dropin.min.js" javascript: document.querySelector("#braintree").innerHTML = ""; var button = document.createElement("button"); button.innerHTML = "Save"; document.querySelector("form").appendChild(button); braintree.dropin.create({ authorization: #{{token.to_json}}, container: "#braintree", vaultManager: true, translations: { payWithCard: "Add a Card", payingWith: "Default payment source", chooseAnotherWayToPay: "Add a different payment source" } }, function (createErr, instance) { if(createErr) console.log(createErr); document.querySelector("form").addEventListener("submit", function(e) { e.preventDefault(); instance._mainView.hideSheetError(); instance._mainView.showLoadingIndicator(); instance.requestPaymentMethod(function(err, payload) { if(err) { console.log(err); instance._mainView.hideLoadingIndicator(); instance._mainView.showSheetError(); } else { e.target.braintree_nonce.value = payload.nonce; fetch("", { "method": "POST", "body": new FormData(e.target) }).then(function(response) { instance._mainView.hideLoadingIndicator(); if(response.status !== 200) { return Promise.reject(response); } }).catch(function(err) { console.log(err); instance._mainView.hideLoadingIndicator(); instance._mainView.showSheetError(); }); } }); }); });