2013-01-16 179 views
3

我有一个非常简单的形式,直到我尝试并重新提交工作正常。在这之后,它更新记录,而不是创建一个新问题:的Rails 3 - 指定窗体操作远程表后提交

在我看来,我有这样的:

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

在我的创造。 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。

这样做的最好方法是什么?谢谢

+0

是否可以发布控制器的创建动作?意见似乎不错,看起来像真正的罪魁祸首是控制器的行为。 –

+0

是的,谢谢。将在几个发布。已经玩过,但仍然无法让它工作。只需确认,@order_new应该在xxxx.save部分之内? – simonmorley

回答

1

我不是这方面的专家,但亚当的答案似乎是正确的。我假设你有类似下面在你的控制器动作:

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将被传递。希望这会有所帮助。

1

我不熟悉semantic_form_for,但我认为它是常规form_for的超集。

的方式form_for作品是它考察模型,看它是否依然存在,那么它默认的东西相匹配。我个人认为从edit行动中调用form_for会采取update,但它不会。对于任何未执行的模型,form_for将假定动作为create,对于任何持续模型,动作将为update。我相信你可以覆盖这个,如果你想,但我没有尝试过自己做。

这听起来像你可能做的是显示模式,并试图在同一页上打造的全新车型。 (如果我错了,请包括您的控制器,因为很难说出您打算做什么。)您可能需要控制器中的@show_order@new_order

我希望帮助,如果没有,也许你可以提供关于控制器的更多细节。

编辑:每当你希望能够创建一个新的模式

,你需要确保你的控制器调用@new_order = Order.new并确保form_for被称为与@new_ordernew_只是一个区分新的和旧的前缀。

在这种情况下,我不确定控制器是order#show还是order#create的成功部分。

对于show你想要的东西是这样的:

@order = Order.find(params[:id]) 
@new_order = Order.new 

如果你这样做出来的create你可能想:

@order = Order.new(params[:order]) 

if @order.save 
    @new_order = Order.new 
    redirect_to ??? 
else 
    render :new 
end 

上述所有应该完全匹配的股票控制器除了增加@new_order。 (换句话说,不要删除respond_toformat行,如果他们在那里。)

+0

嗨杰夫,它有一点帮助。我的控制器与股票几乎没有变化 - 不确定这会如何影响。可以做一个例子。 – simonmorley

1

问题是,你的create.js正在读取来自创建操作结果的@order现有的@order因此成为更新。

One fix:在您的'if @ order.save'创建部分创建一个新的@order:@order_new = Order.new。

现在告诉你的窗体部分与使用顺序排列,而不@order:

semantic_form_for [@location, order], :remote => true do |f| 

更新您的create.js有:

$("#new_order_form").html("<%= escape_javascript(render 'form', :order => @order_new) %>"); 

请务必更新任何引用的形式呈现给还可以使用:order => @order。例如:

<%= render 'form', :order => @order %> 

如果您的@location需要成为新实例,则同样的规则也适用。

我用@order_new代替的情况下,覆盖@order你想要做的东西@order在create.js

附注(其他观众):的Rails 3.x的渲染方法没有按” t需要partials =>和locals =>助手。

+0

嘿,谢谢你的回答。你是否想要在form_for部分或@order中下单? – simonmorley

+0

订单进入form_for部分。你想使用@order_new,所以你把它作为顺序传递给表单partial(:order => @order_new),这样你的new.html.erb和edith.html。erb可以使用相同的形式部分,他们只是使用任何传递给他们。 – Adam21e

+0

那么,它应该是semantic_form_for [@location,order]而不是semantic_form_for [@location,@order]? – simonmorley