Javascript 在Rails 6中使用事件处理程序

Javascript 在Rails 6中使用事件处理程序,javascript,ruby-on-rails,stripe-payments,dom-events,turbolinks,Javascript,Ruby On Rails,Stripe Payments,Dom Events,Turbolinks,在我试图使用rails 6将stripe V3实现到我的web应用程序中时,我想我已经发现了另一个问题。当我提交表单时,我的事件处理程序似乎不起作用,这需要发生,以便我的隐藏字段可以传递到后端进行条带处理。我认为这与TurboLink和缓存有关?在过去的13个小时里,我一直在试图弄明白这一点,今天我已经没有精力了。这是我的代码,我真的需要一些帮助 以下是我认为Javascript应该执行的代码: <script src="https://js.stripe.com/v3/&quo

在我试图使用rails 6将stripe V3实现到我的web应用程序中时,我想我已经发现了另一个问题。当我提交表单时,我的事件处理程序似乎不起作用,这需要发生,以便我的隐藏字段可以传递到后端进行条带处理。我认为这与TurboLink和缓存有关?在过去的13个小时里,我一直在试图弄明白这一点,今天我已经没有精力了。这是我的代码,我真的需要一些帮助

以下是我认为Javascript应该执行的代码:

<script src="https://js.stripe.com/v3/"></script>;

<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>

<div class="row">
    <div class="col-md-9 mb-md-0 mb-5">
        <%= form_for @order do |f| %>

        
           
        <%= f.hidden_field 'referred_by_school', { id: "referBySchool" } %>

           <div class="row">
                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.label :customer_name, "Your Name *", class: "control-label" %><br />
                        <%= f.text_field :customer_name, class: "form-control" %>
                    </div>
                </div>

                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.label :email, "Email *", class: "control-label" %><br />
                        <%= f.text_field :email, class: "form-control" %>
                    </div>
                </div>
           </div>
        <% if locals[:buy_method] == "group"%>

            <div class="row">
                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.label :student_name, "Student Name *", class: "control-label" %><br />
                        <%= f.text_field :student_name, class: "form-control" %>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.label :school_name, "School or Group Name *", class: "control-label" %><br />
                        <%= f.text_field :school_name, class: "form-control"%>
                    </div>
                </div>
            </div>

        <br>
        
        <% end %>
        <div class="col-md-2">Shipping Info</div>
    
            <div class="col-md-6">
            
                <div class="shipping-container">
                    <div class="row">
                            <div class="col-md-12">
                                <div class="md-form mb-0">
                                    <%= f.label :street_address, "Street Address *", class: "control-label" %><br />
                                    <%= f.text_field :street_address, class: "form-control" %>
                                </div>
                            </div>
                    </div>

                    <div class="row">
                        <div class="col-md-4">
                            <div class="md-form mb-0">
                                <%= f.label :city, "City *", class: "control-label" %><br />
                                <%= f.text_field :city, class: "form-control" %>
                            </div>
                        </div>

                        <div class="col-md-3">
                            <div class="md-form mb-0">
                                <%= f.label :state, "State *", class: "control-label" %><br />
                                <%= f.select :state, ['AL', 'AK', 'AS', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'DC', 'FM', 'FL', 'GA', 'GU', 'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MH', 'MD', 'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 'NM', 'NY', 'NC', 'ND', 'MP', 'OH', 'OK', 'OR', 'PW', 'PA', 'PR', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VT', 'VI', 'VA', 'WA', 'WV', 'WI', 'WY' ], class: "form-control"%>
                            </div>
                        </div>

                        <div class="col-md-4">
                            <div class="md-form mb-0">
                                <%= f.label :zip_code, "Zip code *", class: "control-label" %><br />
                                <%= f.text_field :zip_code, class: "form-control" %>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <br>

            <div class="row">
                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.check_box :email_permission, checked: "checked", checked_value: true, unchecked_value: false %>
                        <%= f.label :email_permission, class: "checkbox-inline", class: "control-label" %>
                    </div>
                </div>
           </div>

           <br>

            <div class="row">
                <div class="col-md-6">
                    <div class="md-form mb-0">
                        <%= f.label :number_books, value: "Number of books to purchase *", class: "control-label" %><br />
                        <% if locals[:buy_method] == "group" %>
                            <%= f.text_field :number_books, class: "form-control", id: "groupNumberBooks" %>
                        <% elsif locals[:buy_method] == "individual" %>
                            <%= f.text_field :number_books, class: "form-control", id: "individualNumberBooks" %>
                        <% end %>
                    </div>
                </div>
            </div>

            <% if locals[:buy_method] == "group" %>
                <div class="col-md-2">
                    <div class="row">
                        <%= f.label :total, value: "Total: $", class: "control-label" %>
                    </div>

                    <div class="row">
                        <%= f.label :total, id: "groupTotal", class: "form-control", value: 0 %>  
                    </div>
                </div>
            <% end %>

            <% if locals[:buy_method] == "group" %>
                <div class="row" id="card_field1">
                    <div class="col-md-6">
                        <div id="card-element-1"><!--Stripe.js injects the Card Element--></div>
                            <button id="submit-1">
                                <div class="spinner hidden" id="spinner"></div>
                                <span id="button-text">Pay</span>
                            </button>
                            <p id="card-errors-1" role="alert"></p>
                    </div>
                </div>
            <% end %>

            <% if locals[:buy_method] == "individual" %>
                <div class="row">
                    
                    <div class="form-group">
                        <%= f.label :total, value: "Total: $", class: "control-label" %> <br>
                        <%= f.label :total, id: "individualTotal", class: "form-control", value: 0 %>
                    </div>
                    
                </div>
            <% end %>

            <% if locals[:buy_method] == "individual" %>
                <div class="row" id="card_field2">
                    <div class="col-md-6">
                        <div id="card-element-2"><!--Stripe.js injects the Card Element--></div>
                            <button id="submit-2">
                                <div class="spinner hidden" id="spinner"></div>
                                <span id="button-text">Pay</span>
                            </button>
                            <p id="card-errors-2" role="alert"></p>
                            
                    </div>
                </div>
            <% end %>
           
        
               
        <% end %>
    </div>
</div>





运输信息






支付


支付

下面是应该对其进行操作的Javascript(我目前将其存储在视图中,并将在它正常工作后处理重新定位)

script>
//创建条带客户端。
var stripe=stripe('pk挈U测试挈挈挈挈挈挈挈挈挈挈挈挈挈挈挈;
//创建元素的实例。
var elements1=stripe.elements();
var elements2=stripe.elements();
//创建元素时,可以将自定义样式传递给选项。
//(请注意,此演示使用的样式集比下面的指南更广泛。)
变量样式={
基数:{
颜色:“#32325d”,
fontFamily:“新赫尔维蒂卡”,赫尔维蒂卡,无衬线,
fontSmoothing:'抗锯齿',
fontSize:'16px',
“::占位符”:{
颜色:“#aab7c4”
}
},
无效:{
颜色:“#fa755a”,
iconColor:“#fa755a”
}
};
//创建卡元素的实例。
var card1=elements1.create('card',{style:style});
var card2=elements2.create('card',{style:style});
//将card元素的实例添加到“card元素”中。
卡1.安装(“#卡元件-1”);
卡2.安装(“#卡元件-2”);
//处理来自卡元素的实时验证错误。
卡片1.on('change',函数(事件){
var displayError1=document.getElementById('card-errors-1');
if(event.error){
displayError1.textContent=event.error.message;
}否则{
displayError1.textContent='';
}
});
卡片2.on('change',函数(事件){
var displayError2=document.getElementById('card-errors-2');
if(event.error){
displayError2.textContent=event.error.message;
}否则{
displayError2.textContent='';
}
});
//在表单提交时创建令牌,并将令牌发送到后端以创建费用。
var form=document.getElementById('new_order');
表单.addEventListener('submit-1',函数(事件){
event.preventDefault();
stripe.createToken(card1).then(函数(结果){
if(result.error){
//通知客户有错误。
var errorElement=document.getElementById('card-errors-1');
errorElement.textContent=result.error.message;
}否则{
//将令牌发送到服务器。
stripeTokenHandler(result.token);
}
});
})
script>

// Create a Stripe client.
var stripe = Stripe('pk_test_****************************************************************');

// Create an instance of Elements.
var elements1 = stripe.elements();
var elements2 = stripe.elements();

// Custom styling can be passed to options when creating an Element.
// (Note that this demo uses a wider set of styles than the guide below.)
var style = {
  base: {
    color: '#32325d',
    fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
    fontSmoothing: 'antialiased',
    fontSize: '16px',
    '::placeholder': {
      color: '#aab7c4'
    }
  },
  invalid: {
    color: '#fa755a',
    iconColor: '#fa755a'
  }
};




// Create an instance of the card Element.
var card1 = elements1.create('card', {style: style});
var card2 = elements2.create('card', {style: style});


// Add an instance of the card Element into the `card-element` <div>.
card1.mount('#card-element-1');
card2.mount('#card-element-2');

// Handle real-time validation errors from the card Element.
card1.on('change', function(event) {
  var displayError1 = document.getElementById('card-errors-1');
  if (event.error) {
    displayError1.textContent = event.error.message;
  } else {
    displayError1.textContent = '';
  }
});

card2.on('change', function(event) {
  var displayError2 = document.getElementById('card-errors-2');
  if (event.error) {
    displayError2.textContent = event.error.message;
  } else { 
    displayError2.textContent = '';
  }
});


// create a token on form submission and send token to back end to create charge.
var form = document.getElementById('new_order');

form.addEventListener('submit-1', function(event) {
  event.preventDefault();

  stripe.createToken(card1).then(function(result) {
    if (result.error) {
      // Inform the customer that there was an error.
      var errorElement = document.getElementById('card-errors-1');
      errorElement.textContent = result.error.message;
    } else {
      // Send the token to your server.
      stripeTokenHandler(result.token);
    }
  });
});

var form = document.getElementById('new_order');

form.addEventListener('submit-2', function(event) {
  event.preventDefault();

  stripe.createToken(card2).then(function(result) {
    if (result.error) {
      // Inform the customer that there was an error.
      var errorElement = document.getElementById('card-errors-2');
      errorElement.textContent = result.error.message;
    } else {
      // Send the token to your server.
      stripeTokenHandler(result.token);
    }
  });
});



function stripeTokenHandler(token) {
  // Insert the token ID into the form so it gets submitted to the server
  var form = document.getElementById('new_order');
  var hiddenInput = document.createElement('input');
  hiddenInput.setAttribute('type', 'hidden');
  hiddenInput.setAttribute('name', 'stripeToken');
  hiddenInput.setAttribute('value', token.id);
  form.appendChild(hiddenInput);

  // Submit the form
  form.submit();
};

</script>