0

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"}]

または、仮想メソッドで喜んで処理できるあらゆる種類のコレクション。

ふぅ!聖なる煙!ありがとう!

4

0 に答える 0