我有一个非常简单的表单,在我尝试重新提交之前可以正常工作。之后,它会更新记录而不是创建新记录:

在我看来,我有这个:

#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/

10-16 00:24
查看更多