2017-05-23 7 views
0

新しいレコードの作成と既存のレコードの編集には同じフォームを使用します。フォームが新しいレコードを送信しているのか、既存のレコードを編集しているのかに基づいて、呼び出すコントローラを指定する方法を教えてください。フォーム見出しに基づいてフォーム提出を変更する

たとえば、以下のコードでは、フォームが既存のレコードを編集しているか新しいレコードを送信しているかに基づいてfmitによって呼び出されるコントローラを変更するにはどうすればよいですか?

<%= 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は、新しいレコードまたは既存のレコードであるかどうかに応じて、フォームが自動的に提出します正しい行動。 (:protocolなどのシンボルを使用した場合に発生する問題は、作成または更新を行っているかどうかを確認できないということです)。

ここではいくつかの悩みを解決する必要があります。 :id => 'new-protocol'Create New Protocolがあるため、作成するか更新するかによって切り替える必要があります。

1
などURLを指定しない限り、自動的にフォームのアクションを生成しますデフォルト form_for、HTTP動詞によって

...それは、オブジェクトが持っているかどうかをチェック言い換えれば、永続オブジェクトのかいないかをチェックするcreate間とupdateそれが決定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

関連する問題