2010-06-11 136 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