ruby-on-rails - 将 form_tag 提交为 ajax 会导致 UnknownFormat 错误或将 js 呈现为 html
问题描述
我有一个 Stripe 表单,当我尝试使用 Ajax 提交它时,我一直遇到错误。
完整的代码在下面,但我一直试图调整的那条线就是这form_tag
条线。有了这个:
<%= form_tag(buy_path(@product.id), id:'payment-form', authenticity_token: true, remote: true) do %>
我收到此错误:
ActionController::UnknownFormat in UsersController#buy
ActionController::UnknownFormat
respond_to do |format| <= HIGHLIGHTED
format.js
end
但是当我指定js
格式时:
<%= form_tag(buy_path(@product.id, format: :js), id:'payment-form', authenticity_token: true, remote: true) do %>
js 文件只是呈现为纯 html。如,浏览器只打印内容:
$("html").hide();
这是我的完整代码。当我删除内联 javascript 时,buy.js.erb
会正常呈现,因此似乎添加了一些 javascript 内容,导致浏览器无法将请求作为 ajax 处理。
购买.html.erb
<!-- The form. Fields are inserted into #card-element with JS -->
<%= form_tag(buy_path(@product.id), id:'payment-form', authenticity_token: true, remote: true) do %>
<div id="card-element">
<!-- A Stripe Element will be inserted here. -->
</div>
<button id="submit-card">Submit Payment</button>
<div id="cancel-bid">Cancel</div>
<% end %>
<script type="text/javascript">
var stripe = Stripe('<%= key %>');
var elements = stripe.elements();
// Create an instance of the card Element.
var card = elements.create('card', {style: style});
// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');
card.addEventListener('change', function(event) {
var displayError = document.getElementById('card-errors');
if (event.error) {
displayError.textContent = event.error.message;
} else {
displayError.textContent = '';
}
});
// Create a token or display an error when the form is submitted.
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
event.preventDefault();
stripe.createToken(card).then(function(result) {
if (result.error) {
// Inform the customer that there was an error.
var errorElement = document.getElementById('card-errors');
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('payment-form');
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>
users_controller/rb
def buy
respond_to do |format|
format.js
end
end
购买.js.erb
$("html").hide();
解决方案
推荐阅读
- r - 带有颜色和图例的简单 ggplot2 情况
- android - Android Room 和 Sqldelight 的根本区别是什么?
- angular - Translateservice 在 Ionic3 的两个页面中不起作用?
- branch - 如何在采样模式下使用 perf_event_open 读取 BRANCH STACK 的值?
- javascript - 单击时如何更改部分字符串的样式:Reactjs
- ios - 使用代码“setImage”设置按钮图像时出现问题
- spring - dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序
- python - 网格搜索后如何从 XGBRegressor 函数中提取参数?
- python - 在断开连接的系统上显示 Plotly 地图
- heroku - Heroku CLI 命令在由 cron 执行时不起作用