Rails,使用has_many通过和fields_for

问题描述:

我有点麻烦得到这个工作。Rails,使用has_many通过和fields_for

class User < ActiveRecord::Base 
    has_many :events, :through => :event_users 
    has_many :event_users 
    accepts_nested_attributes_for :event_users, :allow_destroy => true, :reject_if => proc { |obj| obj.blank? } 
end 

class Event < ActiveRecord::Base 
    has_many :event_users 
    has_many :users, :through => :event_users 
    accepts_nested_attributes_for :users, :reject_if => lambda { |a| a[:nick].blank? }, :allow_destroy => true 
end 

class EventUser < ActiveRecord::Base 
    set_table_name :events_users 
    belongs_to :event 
    belongs_to :user 
end 

表布局:

events_users 
    user_id 
    event_id 
    is_participating 

events 
    id 
    name 

users 
    id 
    name 

这是形式

<%= form_for @event do |f| %> 
    <%= f.fields_for :users, f.object.users do |builder| %> 
    <%= builder.text_field :name, "Name" %> 
    <%= f.fields_for :event_users do |builder2| %> 
     <%= builder2.hidden_field :is_participating, :value => true %> 
    <% end %> 
    <% end %> 
<% end %> 

我试图做到的是设置字段中events_users表is_participating代码,但它不起作用!

您的events_users表没有'id'字段作为主键吗?如果您发布了events_users连接表的表格布局,可能会有所帮助。

+0

我已经添加了! – jonepatr 2011-01-11 23:17:42

我有这个同样的问题,基本上就是我所做的就是以下几点:

<%= form_for @event do |f| %> 
    <%= f.fields_for :event_users, @event_user do |builder| %> 
     <%= builder.hidden_field :is_participating, :value => true %> 
     <%= f.fields_for :users, f.object.user do |builder2| %> 
     <%= builder2.text_field :name, "Name" %> 
     <% end %> 
    <% end %> 
<% end %> 

即,我切换嵌套对象的顺序。这要求你通过声明的连接表(你这样做)建立关系。它为我保存了三张桌子上的所有属性。

但是,如果你想保留你的当前模型,我不知道你是否应该为第二级嵌套窗体设置第一级。也就是说,您的f.fields_for:event_users后面应该跟着一个逗号和该类的一个实例。