接受has_many关系的嵌套属性

时间:2011-03-04 18:28:39

标签: ruby-on-rails

以下是我的两个模型类

class Patient < ActiveRecord::Base
  belongs_to :user, :dependent => :destroy
  has_many :enrollments, :dependent => :destroy
  has_many :clients, :through => :enrollments

  accepts_nested_attributes_for :user
  accepts_nested_attributes_for :enrollments
  attr_accessible :user_attributes,:enrollments_attributes, :insurance
end

class Enrollment < ActiveRecord::Base
  belongs_to :client
  belongs_to :patient
  attr_accessible :client_id, :patient_id, :patient_id, :active 
end

在我的患者表格中,我希望有一个多选框,可以将患者分配给客户。有没有办法可以做到这一点,所以我没有任何逻辑 控制器除了

@patient = Patient.new(params)
@patient.save

我试过这个:

<%= patient_form.fields_for :enrollments do |enrollments_fields| %>
<tr>
    <td class="label">
        <%= enrollments_fields.label :client_id %>:                     
    </td>
    <td class="input">
        <%= enrollments_fields.collection_select(:client_id, @clients, :id, :name, {}, :multiple => true) %>
    </td>                   
</tr>
<% end %>

但它只保存了第一个客户端。如果删除多个部分,它会起作用,但我只能选择1个客户端!

select的html值是:

3 个答案:

答案 0 :(得分:4)

我最终做了以下事情:

<%= check_box_tag "patient[client_ids][]", client.id, @patient.clients.include?(client) %>

我不确定这是否是最好的方法...任何评论(我必须更新我的模型以包含attr_accessible:client_ids

答案 1 :(得分:4)

在Rails 3中(不确定以前的版本),您甚至不需要使用accepts_nested_attributes_for来完成此任务。您只需删除列出的所有视图代码,然后将其替换为以下内容:

<%= patient_form.select(:client_ids, @clients.collect {|c| [ c.name, c.id ] }, {}, {:multiple => true})%>

Rails会发挥它的魔力(因为你将select命名为“client_ids”)并且它会起作用。

答案 2 :(得分:0)

而不是

:client_id
<_>在collection_select中,尝试

"client_id[]"

第二种形式指定您接受属性的ID数组而不是单个ID。

以下是表格中使用选择助手的良好资源:http://shiningthrough.co.uk/Select-helper-methods-in-Ruby-on-Rails