2010-06-11 171 views
4

我想保存到habtm關係中的連接表,但我遇到了問題。嵌套窗體&habtm

從我的觀點,我通過一組ID具有:

<%= link_to "Create New User", new_user_url(:group => 1) %> 

 

# User model (user.rb) 
class User < ActiveRecord::Base 
    has_and_belongs_to_many :user_groups 
    accepts_nested_attributes_for :user_groups 
end 

 

# UserGroups model (user_groups.rb) 
class UserGroup < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

 

# users_controller.rb 
def new 
    @user = User.new(:user_group_ids => params[:group]) 
end 

在新的用戶視圖中,我可以訪問User.user_groups對象,但是當我提交表單時,它不僅保存到我的連接表(user_groups_users)中,而且對象不再存在。我的User對象的所有其他對象&都是持久性的,用戶組除外。

我剛開始學習導軌,所以也許我在這裏錯過了一些概念上的東西,但是我一直在爲此苦苦掙扎。

+0

當你提交你打電話'create'法的形式,對不對?你可以發佈這個方法的代碼嗎? – 2010-06-11 20:42:53

回答

4

而不是使用accept_nested_attributes_for,你有沒有考慮過只是將用戶添加到控制器中的組?這樣你就不需要來回傳遞user_group_id。

在users_controller.rb:

def create 
    @user = User.new params[:user] 
    @user.user_groups << UserGroup.find(group_id_you_wanted) 
end 

這種方式,你還可以從篡改的形式和添加他們自己,他們希望無論哪個組阻止人們。

+0

自從我最初發布這個問題以來,我學到了很多東西。這正是我現在使用的方法。 – brewster 2010-11-29 02:32:31

0

你的創建方法在users_controller.rb中看起來像什麼?

如果您使用的是在您看來fields_for構建,例如:

<% user_form.fields_for :user_groups do |user_groups_form| %> 

你應該能夠只通過PARAMS [:用戶(或者不管它是什麼),以User.new( ),它將處理嵌套的屬性。

0

擴展在@jimworm的回答是:

groups_hash = params[:user].delete(:groups_attributes) 
group_ids = groups_hash.values.select{|h|h["_destroy"]=="false"}.collect{|h|h["group_id"]} 

這樣一來,你猛拉敲定params哈希表的,只有收集到的ID。現在,您可以單獨保存用戶,如:

@user.update_attributes(params[:user]) 

,並添加/刪除他的研究小組在同一行分別標識:

# The next line will add or remove items associated with those IDs as needed 
# (part of the habtm parcel) 
@user.group_ids = group_ids