2017-05-23 70 views
0

我使用相同的表單創建新記錄並編輯現有記錄。如何根據表單是提交新記錄還是編輯現有記錄來指定要調用的控制器。根據表單標題更改表單提交

例如,在下面的代碼中,如何根據表單是編輯現有記錄還是提交新記錄來更改由f.submit調用的控制器?

<%= form_for :protocol, url: protocols_path, :html => {:class => 'form', :id => 'new-protocol'} do |f| %> 
    <h1>Create New Protocol</h1> 

    <div class="field"> 
    <%= f.text_field :name, autofocus: true, placeholder: 'name'%> 
    </div> 

    <div class="actions"> 
    <%= f.submit "Submit", class: 'button' %> 
    </div> 

回答

1

我認爲,基於該docs,如果你這樣做:

<%= form_for @protocol :html => {:class => 'form', :id => 'new-protocol'} do |f| %> 
    ... 
<% end %> 

然後,根據@protocol是否是一個新的記錄或現有的記錄,表格將自動提交正確的行動。 (使用符號產生的問題,例如:protocolform_for無法分辨您是否正在創建或更新。)

現在,您將不得不做一些大驚小怪。因爲您需要切換:id => 'new-protocol'Create New Protocol,這取決於您是在創建還是在更新。

1

默認form_for將自動生成表格操作,除非你指定的URL,HTTP動詞,等等......它決定createupdate之間的檢查,如果它是一個持久化對象與否,換句話說,如果檢查對象有id

理想情況下,你應該使用下列內容:

<%= form_for @protocol do |f| %> 
    <h1>Create New Protocol</h1> 

    <div class="field"> 
    <%= f.text_field :name, autofocus: true, placeholder: 'name'%> 
    </div> 

    <div class="actions"> 
    <%= f.submit "Submit", class: 'button' %> 
    </div> 

這樣:

@protocol = Protocol.new #=> the form action will point to create action 
@protocol = Protocol.find(params[:id]) #=> the form action will point to update action 
+0

完美。感謝您的徹底解答!我必須給jvillian這張支票,因爲他首先回答了類似的答案。 – Darkisa