好的根据所取得的进展大量更新这个问题,同时通过消除一些与问题无关的信息来简化这个问题。我一直在审查很多关于 has_many 的帖子和 railscasts :通过,但我仍然对相对简单的/新形式有问题......这是模型:
/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并有一个表格,其中包含一些患者信息和两个医生(用户)的下拉列表。执行此操作的经典方法已解释为:
/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 %>
现在上面实际上确实导致了表单出现,并且有两个“摄入” html select 元素!是的!问题是A)只有第一次摄入会保存,因为B)摄入 HTML 格式与我在所有建议中看到的不匹配,C)我无法确定正确的 SELECT 语法来获取与建议匹配的 HTML 格式。
上述代码生成的 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 食谱中想要的是: name="patient[new_intake_attributes][][user_id]"
他们说您应该通过以下选择行来实现这一目标: select("patient[new_intake_attributes][]", "user_id",
但是,该语法给了我 *`@patient[new_intake_attributes]' is not allowed as an instance variable name*
我已经尝试了很多 [] 和患者,患者,:患者的变体,但我无法得到任何东西来给我在患者 [new_intake_attributes] 之后包含空 [] 的 HTML
所以,此时我在表单上有两个选择框,但只有一个保存,因为只有一个在 params 哈希中传递。其中,顺便说一句,看起来像这样:
(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"}]
或者我可以很乐意在我的虚拟方法中处理的任何类型的集合。
哇!圣烟!谢谢!