2013-03-05 61 views
0

我有一個創建(和更新)材質的導軌形式。很明顯,默認情況下,當用戶登錄並且檢索到材料時,表單將使用更新操作進行呈現。但是,如果用戶想要保存其他版本的資料,我希望有一個「另存爲」操作。做到這一點的顯而易見的方法是有一個按鈕發送到'更新'在控制器和另一個發送到'新',但我不知道該怎麼做,因爲它似乎取決於form_for參數。如何從軌道形式設置兩個不同的動作?

更新

要避免使用Javascript我試圖改變的form_for網址:

<%= form_for @material, :url => choose_action_path do |f| %> 

然後在控制我有:

def choose_action 
    if params[:save_as] == "Save As" 
    redirect_to :action => "create" 
    else 
    redirect_to :action => "update" 
    end 
end 

,但是這是行不通的。這是一種可以發揮作用的策略嗎?

+0

聽起來像一個壞主意。如何僅在服務器端正確處理表單?您可以從一個控制器委派到任何需要的地方。這種形式在瀏覽器中很容易混淆。 – vector 2013-03-05 22:24:45

+0

你可以添加一個複選框來知道用戶是否想創建一個新版本或保存實際版本。而在服務器端,只需檢查複選框是否已被選中並委託給適當的方法。 – TimPetricola 2013-03-05 22:27:29

+0

通過重定向您將表單中發佈的所有數據都丟失。所以你的'choose_action'這個想法確實很瘋狂。 – Mischa 2013-03-06 13:09:43

回答

0

你也許可以用jQuery來做到這一點。

假設您正在使用的模型稱爲電子郵件。編輯電子郵件時,使用創建的表格標籤具有動作action='/emails/:id和方法method='post'。隱藏表單標籤下面是一樣的東西

<form accept-charset="UTF-8" action="/email/1" method="post"> 
    <div style="margin:0;padding:0"> 
    <input name="_method" type="hidden" value="put" /> 
    <input name="utf8" type="hidden" value="&#x2713;" /> 
    <input name="authenticity_token" type="hidden" value="f755bb0ed134b76c432144748a6d4b7a7ddf2b71" /> 
    </div> 

更多信息可以在這裏找到:http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-put-or-delete-methods-work

那的代碼中加入額外塊使表單提交PUT請求,而不是一個帖子,隨後映射到更新的你的控制器的行爲。要讓它將表單發送到創建操作,您需要發佈操作「/ email」。換句話說,你想操縱上面的代碼到類似的東西

<form accept-charset="UTF-8" action="/email" method="post"> 

請注意去除div標籤。

所以我的建議是創建一個按鈕「另存爲」,然後添加一些jquery,當點擊「另存爲」按鈕時將進行這些修改。

這個計算器的答案可能會幫助你與jquery Jquery to change form action

相關問題