Если честно, я никогда не пытался редактировать или создавать has_many :through
таким образом.
Потребовалось немного времени, и пришлось исправить js внутри formtastic_cocoon , чтобы заставить его работать, поэтому вот рабочее решение.
Вам нужно указать модель EventUser
, а затем заполнить модель User
(обратный путь никогда не сработает).
Так внутри моделей вы пишете:
class Event < ActiveRecord::Base
has_many :event_users
has_many :users, :through => :event_users
accepts_nested_attributes_for :users, :reject_if => proc {|attributes| attributes[:name].blank? }, :allow_destroy => true
accepts_nested_attributes_for :event_users, :reject_if => proc {|attributes| attributes[:user_attributes][:name].blank? }, :allow_destroy => true
end
class EventUser < ActiveRecord::Base
belongs_to :user
belongs_to :event
accepts_nested_attributes_for :user
end
class User < ActiveRecord::Base
has_many :events, :through => :event_users
has_many :event_users
end
Тогда взгляды. Начните с events/_form.html.haml
= semantic_form_for @event do |f|
- f.inputs do
= f.input :name
%h3 Users (with user-type)
#users_with_usertype
= f.semantic_fields_for :event_users do |event_user|
= render 'event_user_fields', :f => event_user
.links
= link_to_add_association 'add user with usertype', f, :event_users
.actions
= f.submit 'Save'
(сейчас я игнорирую ошибки)
Затем вам нужно указать частичную _event_user_fields.html.haml
частичную (здесь немного волшебства):
.nested-fields
= f.inputs do
= f.input :user_type, :as => :hidden, :value => 'participating'
- if f.object.new_record?
- f.object.build_user
= f.fields_for(:user, f.object.user, :child_index => "new_user") do |builder|
= render("user_fields", :f => builder, :dynamic => true)
и завершить _user_fields
частичное (которое на самом деле не должно быть частичным)
.nested-fields
= f.inputs do
= f.input :name
Это должно работать.
Обратите внимание, что мне пришлось обновить formtastic_cocoon gem , поэтому вам нужно будет обновить его до версии 0.0.2.
Теперь можно было бы легко выбрать user_type
из простого раскрывающегося списка вместо скрытого поля, например. использовать
= f.input :user_type, :as => :select, :collection => ["Participator", "Organizer", "Sponsor"]
Некоторые мысли (теперь я доказал, что это работает):
- это всегда будет создавать новых пользователей на лету, фактически устраняя необходимость в
EventUser
. Разрешите ли вы выбирать существующих пользователей из выпадающего списка?
- лично я бы перевернул это: пусть пользователи назначают себя на событие!