OK進捗状況に基づいてこの質問を大幅に更新し、問題に関係のない情報を削除することでこれを簡素化します。has_many:throughに関する多くの投稿とrailscastを確認してきましたが、まだ比較的単純な/新しいフォームで問題が発生しています...モデルは次のとおりです。
/app/models/user.rb(ユーザーを医者と考えてください)
has_many :intakes
has_many :patients, :through => :intakes
accepts_nested_attributes_for :intakes
/app/models/intake.rb
belongs_to :user
belongs_to :patient
/app/models/patient.rb
has_many :intakes
has_many :users, :through => :intakes
accepts_nested_attributes_for :intakes
accepts_nested_attributes_for :users
さて、私がやりたいのは、単純な/patients/newであり、フォームにいくつかの患者情報と医師(ユーザー)用の2つのドロップダウンがあります。これを行うための古典的な方法は、次のように説明されています。
/app/controllers/patients_controller.rb
def new
@patient = Patient.new
2.times { @patient.intakes.build.build_user }
end
そして私の見解では: /app/views/patient/new.html.erb
<%= form_for @patient do |f| %>
<%= render 'fields', :f => f %>
<%= f.submit "Add Patient" %>
<% end %>
そして最後に、フィールドの一部: /app/views/patients/_fields.html.erb
<%= f.fields_for :intakes do |builder| %>
<%= builder.label :first_name, "Cared for by" %>
<%= select("patient[new_intake_attributes]", "user_id",
User.justthishosp(current_user.hospital).collect {
|user|
[ user.first_name+" "+user.last_name, user.id]} ) %>
<% end %>
上記は実際にフォームを表示させます。2つの「インテーク」htmlselect要素があります。うん!問題は次のとおりです。A)最初のインテークのみが保存されます。B)インテークHTML形式がすべての推奨事項に表示されるものと一致しないため、C) HTML形式を推奨事項に一致させるための適切なSELECT構文を決定できません。
上記のコードが生成するHTMLは次のとおりです。
<label for="patient_intakes_attributes_0_first_name">Cared for by</label>
<select id="patient_new_intake_attributes_user_id"
name="patient[new_intake_attributes][user_id]">
<option value="1"> </option>
<option value="4">Dan Akroyd</option>
<option value="2">Dave Collins</option></select>
</p>
<p>
<label for="patient_intakes_attributes_1_first_name">Cared for by</label>
<select id="patient_new_intake_attributes_user_id"
name="patient[new_intake_attributes][user_id]"><option value="1"> </option>
<option value="4">Dan Akroyd</option>
<option value="2">Dave Collins</option></select>
特に、選択名の形式に注意してください: name = "patient [new_intake_attributes] [user_id]"
Advanced Rails Recipesに必要なのは、 name = "patient [new_intake_attributes][][user_id]"です。
そして、彼らはあなたがそれを達成すべきだと彼らが言うように、この選択行でそれを行います: select( "patient [new_intake_attributes] []"、 "user_id"、
ただし、その構文では* `@patient[new_intake_attributes]'はインスタンス変数名として許可されていません*
[]とpatient、Patient、:patientの非常に多くのバリエーションを試しましたが、patient[new_intake_attributes]の後に空の[]を含むHTMLを取得することはできません。
したがって、この時点でフォームに2つの選択ボックスがありますが、paramsハッシュで渡されるのは1つだけなので、1つだけが保存されます。ところで、これは次のようになります。
(PatientsController.create) params[:patient]:
{"first_name"=>"Nine", "last_name"=>"Niner", ...,
"new_intake_attributes"=>{"user_id"=>"2"}, "pri_loc_id"=>"6"}
そして私は必要です:
"new_intake_attributes"=>[{"user_id"=>"2"},{"user_id"=>"4"}]
または、仮想メソッドで喜んで処理できるあらゆる種類のコレクション。
ふぅ!聖なる煙!ありがとう!