2

我有點麻煩得到這個工作。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代碼,但它不起作用!

回答

0

您的events_users表沒有'id'字段作爲主鍵嗎?如果您發佈了events_users連接表的表格佈局,可能會有所幫助。

+0

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

1

我有這個同樣的問題,基本上就是我所做的就是以下幾點:

<%= 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後面應該跟着一個逗號和該類的一個實例。