3

基本的に、@ user1224344のような同じ問題があります:

Railsの同じページから複数の重複したフォームを送信する方法 - できれば1つのボタンで

そして、最初の答えはかなり良さそうに見えますが、レールの初心者として、プロジェクトでそれを転置するのに問題があります。OK、1つの送信ボタンだけで保存する必要がある同じコントローラを持つ2つのフォームがあります:

<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content %></th>
<th><%= f.hidden_field :note, :id => "canvascontent" %></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary', :onclick => "sketch.toDataURL()"  %></th>
<th><input type="button" onclick="sketch.clearRecording()" class="btn btn-small btn-danger" value="Löschen"></th>
<% end %>
</tr>
</table>


<table width="100%">
<tr>
<%= form_for([@patient, @patient.treatments.build]) do |f| %>
<th><%= f.collection_select :category_id, Category.find(:all), :id, :typ %></th>
<th><%= f.text_field :content , :id => "inputbox"%></th>
<th><%= f.text_field :day, :value => Date.today %></th>
<th><%= f.submit  :class => 'btn btn-small btn-primary'%></th>
<% end %>
</tr>
</table>

手伝ってくれてありがとう!特に日曜日の夜に(少なくともここドイツでは)

4

1 に答える 1

4

あなたはかなり近いです。

秘訣は、両方のフォームを送信するフォーム内にネストする必要があることです。フォームは別のモデルにする必要があります。あなたのアプリがどのようにまとめられているかはわかりませんが、患者には多くの治療があると仮定します。モデルには次のものが含まれている必要があります。

患者.rb

attr_accessible :treatments_attributes, etc...
has_many :treatments
accepts_nested_attributes_for :treatments

治療.rb

belongs_to :patient

ご覧のとおり、患者は治療の属性を受け入れます(したがって、そのモデルの 3 行目と 1 行目)。したがって、実際には、治療フォームを患者フォームでラップして、入れ子になった治療で患者フォームを送信する必要があります。このようなもの:

<%= form_for @patient do |f| %>
  <%= f.fields_for @patient.build_treatment do |tf| %>
    <%= render 'treatment_form', locals: { form: tf } %>
  <% end %>
  <%= f.fields_for @patient.build_treatment do |tf| %>
    <%= render 'treatment_form', locals: { form: tf } %>
  <% end %>
  <%= f.submit %>
<% end %>

これで、患者に自動的に関連付けられた、両方の治療フォームを提出する患者用のフォームが 1 つあります。私はそこにある詳細のいくつかを台無しにしているかもしれませんが、それが基本的な考え方です。

編集-これをチェックしてみてください。その質問のように、治療フォームオブジェクトの構築をコントローラーに配置するのが最善です。また、accepts_nested_attributes_for に関するより具体的なヘルプについては、Rails API を確認してください。

また、「ローカル」というのは、変数名「form」でパーシャルに処理フォーム オブジェクトを渡しているだけなので、そのパーシャルでは <%= form.label :whatever %> と記述します。 ..など、その部分内。

コントローラーでフォーム オブジェクトを構築すると、

@patient.build_treatments #may not be exactly this, but it's close

-- 次に、ビューでこれを行うことができます。

<%= f.fields_for :treatment do |tf| %>

また、明確でない場合、上記のコードに基づいて、パーシャルは次のようになります。

<table width="100%">
  <tr>
    <th><%= form.collection_select :category_id, Category.find(:all), :id, :typ %></th>
    <th><%= form.text_field :content , :id => "inputbox"%></th>
    <th><%= form.text_field :day, :value => Date.today %></th>
  </tr>
</table>

より直感的なその他のレイアウト:

メインビュー

<%= form_for @patient do |f| %>
  <%= render 'treatment_form', form: f %>
<% end %>

部分図

<%= form.fields_for :treatment do |field| %>
  <% field.label :whatever %> #...

つまり、fields_for への呼び出しをパーシャル内に移動すると、より理にかなっている可能性があります。何かが実際にどのように機能するかを実際に変更するべきではありません。

于 2013-07-21T18:38:32.950 に答える