嵌套形式&的habtm

时间:2010-06-11 20:27:59

标签: ruby-on-rails ruby has-and-belongs-to-many nested-forms

我正试图以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对象的属性是持久的。

我刚开始学习rails,所以也许我在这里概念性地遗漏了一些东西,但我一直在努力解决这个问题。

3 个答案:

答案 0 :(得分:4)

您是否考虑过只将用户添加到控制器中的组,而不是使用accepts_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

通过这种方式,您还可以阻止人们对表单进行篡改,并将自己添加到他们想要的任何组中。

答案 1 :(得分:0)

您的create方法在users_controller.rb中的含义是什么?

如果您在视图中使用fields_for构造,例如:

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

您应该能够将params [:user](或其他任何东西)传递给User.new(),它将处理嵌套属性。

答案 2 :(得分: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])

并在一行中单独添加/删除他的组ID:

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