我正试图让它发挥作用,但它不会!
我有
class User < ActiveRecord::Base
has_many :events, :through => :event_users
has_many :event_users
accepts_nested_attributes_for :event_users
end
class Event < ActiveRecord::Base
has_many :event_users
has_many :users, :through => :event_users
accepts_nested_attributes_for :users
end
class EventUser < ActiveRecord::Base
set_table_name :events_users
belongs_to :event
belongs_to :user
accepts_nested_attributes_for :events
accepts_nested_attributes_for :users
end
还有表格布局
event_users
user_id
event_id
user_type
events
id
name
users
id
name
这是我的表格
<%= semantic_form_for @event do |f| %>
<%= f.semantic_fields_for :users, f.object.users do |f1| %>
<%= f1.text_field :name, "Name" %>
<%= f1.semantic_fields_for :event_users do |f2| %>
<%= f2.hidden_field :user_type, :value => 'participating' %>
<% end %>
<% end %>
<%= link_to_add_association 'add task', f, :users %>
<% end %>
问题在于,如果我以这种方式创建新用户,则不会设置user_type的值(但它会创建用户和带有user_id和event_id的event_users)。如果我在创建用户并提交后返回编辑表单,则在events_users中设置user_type的值。 (我也试过没有formtastic) 有什么建议?谢谢!
---- ----编辑
我还尝试在用户
之前使用event_users<%= semantic_form_for @event do |f| %>
<%= f.semantic_fields_for :event_users do |f1| %>
<%= f1.hidden_field :user_type, :value => 'participating' %>
<%= f1.semantic_fields_for :users do |f2| %>
<%= f2.text_field :name, "Name" %>
<% end %>
<% end %>
<%= link_to_add_association 'add task', f, :event_users %>
<% end %>
但它只会给我一个错误:
用户(#2366531740)期待,得到 的ActiveSupport :: HashWithIndifferentAccess(#2164210940)
- 编辑 -
link_to_association是一种formtastic-cocoon方法(https://github.com/nathanvda/formtastic-cocoon),但我尝试过其他方法,但结果相同
--- ----编辑
def create
@event = Event.new(params[:event])
respond_to do |format|
if @event.save
format.html { redirect_to(@event, :notice => 'Event was successfully created.') }
format.xml { render :xml => @event, :status => :created, :location => @event }
else
format.html { render :action => "new" }
format.xml { render :xml => @event.errors, :status => :unprocessable_entity }
end
end
end
答案 0 :(得分:2)
说实话,我从未试图以这种方式编辑或创建has_many :through
。
花了一些时间,并且必须在formtastic_cocoon内修复js以使其正常工作,所以这是一个有效的解决方案。
您需要调整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
。您是否也允许从下拉列表中选择现有用户? 答案 1 :(得分:0)
events_users模型是否没有ID列?由于有一个额外的字段(user_type),因此EventUser是一个模型,应该有一个ID。也许这就是为什么在第一种情况下没有设置user_type的原因。