2013-01-16 154 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