принять вложенные атрибуты для отношения has_many - PullRequest
4 голосов
/ 04 марта 2011

Ниже представлены два моих модельных класса

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 клиента!

Значение html для выбора:

Ответы [ 3 ]

4 голосов
/ 05 марта 2011

Я закончил тем, что сделал следующее:

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

Я не уверен, что это лучший способ ... любые комментарии (мне пришлось обновить мою модель, чтобы включить attr_accessible: client_ids

4 голосов
/ 14 июля 2011

В Rails 3 (не уверен насчет предыдущих версий) вам даже не нужно использовать accepts_nested_attributes_for для этого.Вы можете просто удалить весь код представления, который вы перечислили, и заменить его следующим:

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

Rails сделает свое волшебство (из-за того, что вы назвали select "client_ids"), и он будет просто работать.

0 голосов
/ 04 марта 2011

Вместо

:client_id

в collection_select, попробуйте

"client_id[]"

Вторая форма указывает, что вы принимаете массив идентификаторов для атрибута, а не один.

Вот хороший ресурс по использованию выбранных помощников в формах: http://shiningthrough.co.uk/Select-helper-methods-in-Ruby-on-Rails

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...