问题:表单未将数据提交到订单表
我有一个form_for,它连接到2个控制器,以在提交数据后将数据连接在一起。我最近连接了Stripe Elements,它具有自己的控制器。我有一个虚拟表格,当我提交信息时,数据将通过并保存到订单表中。我删除了表单并将元素表单放到位,但是我设置它的方式不是提交给表。
这是表格:
<form id="form-element" action="/charges" method="post" id="payment_form">
<%= form_for([@listing, @order]) do |form| %>
<% if @order.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@order.errors.count, "error") %> prohibited this order from being saved:</h2>
<ul>
<% order.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<script
src="https://js.stripe.com/v3/">
// data-key="pk_test_3vX123456789YKE1f0B8"
// data-amount = {@listing.price}
// data-locale="auto">
</script>
<div class="form-row">
<label for="card-element">
Credit or debit card
</label>
<div id="card-element" class="form-control">
<!-- a Stripe Element will be inserted here. -->
</div>
<!-- Used to display form errors -->
<div id="card-errors" role="alert"></div>
</div>
<br>
<div class="form-group">
<%= form.submit "asdf", class:"ripple-effect", id:"button-element" %>
</div>
<span class="token"></span>
</form>
<% end %>
</div>
<script>
....
</script>
在我的OrdersController中,这是我的创建方法:
def create
@order = Order.new(order_params)
@listing = Listing.find(params[:listing_id])
@seller = @listing.user
@order.listing_id = @listing.id
@order.buyer_id = current_user.id
@order.seller_id = @seller.id
....
这是我的ChargesController:
def create
@amount = 500
token = params[:stripeToken]
payment_form = params[:payment_form]
charge = Stripe::Charge.create({
:source => 'tok_visa',
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd'
})
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to new_charge_path
end
我尝试将orderscontroller信息发送给chargescontroller,反之亦然。不行然后就知道这是表单设置的方式。因此,基本上,如果那是解决方案,那么当我输入表单时,如何使数据注册到订单表中。
此信息可能会有所帮助..以下是可将信息成功转发到订单表的伪表格:https://pastebin.com/th2WC8Lj
我将form.submit添加到条纹窗体中,但是没有这样做。我认为这至少会创建一个空订单。
尝试使用ajax异步提交表单。.不起作用。
<script>
...
$('#Orders').on('submit', function(event) {
event.preventDefault();
$.ajax({
type: "POST",
url: "/charges",
data: $('#payment_form').serialize()
}).then(this.submit.bind(this));
});
</script>
答案 0 :(得分:0)
当前,该表单正在发布到charges
端点,这意味着仅调用ChargesController#create
代码。您需要执行以下操作:
OrdersController#create
方法中,并删除代码块顶部的<form id="form-element" action="/charges" method="post" id="payment_form">
标签。然后会将表单提交到OrdersController#create
方法。我说重复代码的原因是因为我们不知道是否可以在没有关联订单的情况下创建费用,在这种情况下,您希望保留独立创建费用的功能。