我有一个非常简单的表单,在我尝试重新提交之前可以正常工作。之后,它会更新记录而不是创建新记录:
在我看来,我有这个:
#new_order_form
= render 'form'
我的表格部分:
= semantic_form_for [@location, @order], :remote => true do |f|
-if @order.errors.any?
#notice{:class=>'alert alert-block alert-error fade in'}
%a{:class=>"close", :data=>{:dismiss=>"alert", :href=>"#"}}
x
%h3
= pluralize(@order.errors.count, "error")
- @order.errors.full_messages.each do |msg|
= msg
%br
%table{:class => 'table table-bordered', :style=> {width: '50%'}}
%tr
%td= f.text_field :product_order_id, :placeholder => "Order ID"
在我的 create.js 中:
$("#new_order_form").html("<%= escape_javascript(render("form")) %>");
这可以很好地创建订单并呈现错误(如果存在)。
问题是:如果我在不刷新页面的情况下输入另一个订单号,它会更新之前创建的记录,而不是创建一个新记录。
查看表单代码,我可以看到提交操作被替换为更新。
我试图用这个替换代码:
= semantic_form_for [@location, @order], :remote => true do |f|
#new_order_form
= render 'form', :f => f
这在 create.js
$("#new_order_form").html("<%= escape_javascript(render :partial => 'form', :locals => {:f => @order}) %>");
这也不起作用,并提示无效的 text_field。
做这个的最好方式是什么?谢谢
最佳答案
我不是这个话题的专家,但亚当的回答似乎是正确的。我假设您的 Controller 操作中有如下内容:
def create
@order = Order.new(params[:order])
if @order.save
responds_to do |format|
format.js
format.html { redirect_to 'xxx' }
end
else
responds_to do |format|
format.js
format.html { render :new }
end
end
end
如果你有上面的结构,那么 create.js.erb 只是传递在@order.save 调用后被修改的@order 对象。您可以按如下方式在传递的条件中重新定义它(检查第 4 行):
def create
@order = Order.new(params[:order])
if @order.save
@order = Order.new
responds_to do |format|
format.js
format.html { redirect_to 'xxx' }
end
else
responds_to do |format|
format.js
format.html { render :new }
end
end
end
现在,如果@order 已成功保存,则将创建并传递新订单。否则将传递带有验证错误的旧 @order。希望这会有所帮助。
关于jquery - Rails 3 - 在远程表单提交后指定表单操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14359318/